Skip to content

Commit 6ff0969

Browse files
authored
Merge pull request #11 from Nixlps/release/1.0
Release/1.0
2 parents c199a2c + 4804860 commit 6ff0969

File tree

19 files changed

+2748
-63
lines changed

19 files changed

+2748
-63
lines changed

.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
APP_ENV=local
22

33
# DB local
4-
LOCAL_DB_HOST=localhost
5-
LOCAL_DB_NAME=liven-projeto
4+
LOCAL_DB_HOST=127.0.0.1
5+
LOCAL_DB_NAME=liven_projeto
66
LOCAL_DB_USER=root
77
LOCAL_DB_PASS=senha123

.env.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
DB_CONNECTION=mysql
2+
DB_HOST=127.0.0.1
3+
DB_PORT=3306
4+
DB_DATABASE=liven_projeto
5+
DB_USERNAME=root
6+
DB_PASSWORD=senha123

.github/workflows/phpunit.yml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
name: PHPUnit Tests
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- main
7+
- dev
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
services:
14+
mysql:
15+
image: mysql:5.7
16+
env:
17+
MYSQL_ROOT_PASSWORD: senha123
18+
MYSQL_DATABASE: liven_projeto
19+
ports:
20+
- 3306:3306
21+
options: >-
22+
--health-cmd="mysqladmin ping --silent"
23+
--health-interval=10s
24+
--health-timeout=5s
25+
--health-retries=3
26+
27+
steps:
28+
- name: Checkout code
29+
uses: actions/checkout@v2
30+
31+
- name: Set up PHP
32+
uses: shivammathur/setup-php@v2
33+
with:
34+
php-version: '8.2.12'
35+
extensions: mbstring, pdo, pdo_mysql
36+
37+
- name: Install dependencies
38+
run: composer install --no-progress --no-suggest --prefer-dist
39+
40+
- name: Wait for MySQL to be ready
41+
run: |
42+
echo "Waiting for MySQL to be ready..."
43+
while ! mysqladmin ping -h127.0.0.1 -uroot -psenha123 --silent; do
44+
sleep 1
45+
done
46+
47+
- name: Create User database schema
48+
run: |
49+
mysql -h127.0.0.1 -uroot -psenha123 -e "USE liven_projeto; CREATE TABLE users (
50+
id INT AUTO_INCREMENT PRIMARY KEY,
51+
nome VARCHAR(255) NOT NULL,
52+
email VARCHAR(255) NOT NULL,
53+
senha VARCHAR(255) NOT NULL,
54+
telefone VARCHAR(20) NOT NULL,
55+
UNIQUE KEY (email)
56+
);"
57+
58+
- name: Create Address database schema
59+
run: |
60+
mysql -h127.0.0.1 -uroot -psenha123 -e "USE liven_projeto; CREATE TABLE addresses (
61+
id INT AUTO_INCREMENT PRIMARY KEY,
62+
user_id INT NOT NULL,
63+
logradouro VARCHAR(255) NOT NULL,
64+
numero VARCHAR(20) NOT NULL,
65+
cep VARCHAR(20) NOT NULL,
66+
FOREIGN KEY (user_id) REFERENCES users(id)
67+
ON DELETE CASCADE
68+
ON UPDATE CASCADE
69+
);"
70+
71+
- name: Run PHPUnit
72+
env:
73+
LOCAL_DB_HOST: 127.0.0.1
74+
LOCAL_DB_NAME: liven_projeto
75+
LOCAL_DB_USER: root
76+
LOCAL_DB_PASS: senha123
77+
run: vendor/bin/phpunit --configuration phpunit.xml
78+
79+

.phpunit.result.cache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version":1,"defects":{"UserTest::testRead":8,"UserTest::testCreate":8,"UserTest::testUpdate":8,"UserTest::testDelete":8,"AddressTest::testAddressRead":7,"UserTest::testUserCreate":8,"UserTest::testUserRead":8,"AddressTest::testUserCreate":8,"AddressTest::testAddressCreate":8,"AddressTest::testAddressCreate1":7,"AddressTest::testAddressCreate2":7,"AddressTest::testAddressDeleted":5,"AddressTest::testAddressUpdate":7,"AddressTest::testAddressDelete":7},"times":{"UserTest::testRead":0.001,"UserTest::testCreate":0.06,"UserTest::testUpdate":0.002,"UserTest::testDelete":0.002,"AddressTest::testUserCreate":0.271,"AddressTest::testAddressCreate":0.002,"AddressTest::testAddressRead":0.019,"UserTest::testUserCreate":0.052,"UserTest::testUserRead":0,"UserTest::testUserUpdate":0.001,"UserTest::testUserDelete":0.001,"AddressTest::testUserDelete":0.001,"AddressTest::testAddressCreate1":0.002,"AddressTest::testAddressCreate2":0.002,"AddressTest::testAddressUpdate":0.002,"AddressTest::testAddressDelete":0.001,"AddressTest::testAddressDeleted":0}}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
<?php
2+
3+
namespace App\Controllers;
4+
5+
use App\Models\AddressModel;
6+
7+
class AddressController {
8+
9+
public function get($id) {
10+
try {
11+
$address = new AddressModel;
12+
$addressData = $address->read($id);
13+
if (!$addressData) {
14+
http_response_code(404);
15+
echo json_encode(['error' => 'Usuario nao possui enderecos cadastrados']);
16+
return;
17+
}
18+
19+
$formattedAddresses = array_map(function($address) {
20+
return [
21+
'ID' => $address['id'],
22+
'Logradouro' => $address['logradouro'],
23+
'Numero' => $address['numero'],
24+
'Cep' => $address['cep']
25+
];
26+
}, $addressData);
27+
28+
http_response_code(200);
29+
echo json_encode(['Enderecos do usuario' => $formattedAddresses]);
30+
} catch (\Exception $e) {
31+
http_response_code(500);
32+
echo json_encode(['error' => $e->getMessage()]);
33+
}
34+
}
35+
36+
public function post($id) {
37+
try {
38+
$data = $this->getJsonBody();
39+
$address = new AddressModel;
40+
$createdAddressId = $address->create($data, $id);
41+
if ($createdAddressId !== null) {
42+
http_response_code(201);
43+
echo json_encode(['message' => 'Endereco cadastrado com sucesso', 'id' => $createdAddressId]);
44+
} else {
45+
http_response_code(400);
46+
echo json_encode(['message' => 'Falha ao cadastrar endereco']);
47+
}
48+
} catch (\Exception $e) {
49+
http_response_code(500);
50+
echo json_encode(['error' => $e->getMessage()]);
51+
}
52+
}
53+
54+
public function put($userID, $addressID) {
55+
try {
56+
$data = $this->getJsonBody();
57+
$address = new AddressModel;
58+
$updateResult = $address->update($data, $userID, $addressID);
59+
if ($updateResult === 'no changes') {
60+
http_response_code(200);
61+
echo json_encode(['message' => 'Dados nao alterados: os dados inseridos sao iguais aos ja cadastrados']);
62+
} elseif ($updateResult > 0) {
63+
http_response_code(200);
64+
echo json_encode(['message' => 'Endereco atualizado com sucesso']);
65+
} else {
66+
http_response_code(400);
67+
echo json_encode(['message' => 'Falha ao atualizar endereco: endereco nao encontrado ou nao pertence ao usuario']);
68+
}
69+
} catch (\Exception $e) {
70+
http_response_code(500);
71+
echo json_encode(['error' => $e->getMessage()]);
72+
}
73+
}
74+
75+
public function delete($userID, $addressID) {
76+
try {
77+
$address = new AddressModel;
78+
$affectedRows = $address->delete($userID, $addressID);
79+
if ($affectedRows > 0) {
80+
http_response_code(200);
81+
echo json_encode(['message' => 'Endereco deletado com sucesso']);
82+
} else {
83+
http_response_code(400);
84+
echo json_encode(['message' => 'Falha ao deletar endereco: endereco nao encontrado ou nao pertence ao usuario']);
85+
}
86+
} catch (\Exception $e) {
87+
http_response_code(500);
88+
echo json_encode(['error' => $e->getMessage()]);
89+
}
90+
}
91+
92+
public function getByCep($cep, $userID) {
93+
try {
94+
$address = new AddressModel;
95+
$addressData = $address->readByCep($cep, $userID);
96+
if (!$addressData) {
97+
http_response_code(404);
98+
echo json_encode(['error' => 'Usuario nao possui um endereco com o cep: ' . $cep]);
99+
return;
100+
}
101+
102+
$formattedAddresses = array_map(function($address) {
103+
return [
104+
'Logradouro' => $address['logradouro'],
105+
'Numero' => $address['numero'],
106+
'Cep' => $address['cep']
107+
];
108+
}, $addressData);
109+
110+
http_response_code(200);
111+
echo json_encode(['Endereco do usuario' => $formattedAddresses]);
112+
} catch (\Exception $e) {
113+
http_response_code(500);
114+
echo json_encode(['error' => $e->getMessage()]);
115+
}
116+
}
117+
118+
// Valida o JSON recebido pela requisição
119+
private function getJsonBody() {
120+
$data = json_decode(file_get_contents('php://input'), true);
121+
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
122+
throw new \Exception('Dados invalidos no corpo da requisição');
123+
}
124+
return $data;
125+
}
126+
}

App/Controllers/AuthController.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
namespace App\Controllers;
3+
4+
use App\Models\UserModel;
5+
6+
class AuthController {
7+
private $secretKey = 'f1d2d2f1c4e2b8f1e0f9b8e1d4e2b7c6d1e8a7b5f1e0f8c2b1d7a8f9b1c2d3e4a7b8d9c0e2f1a6b5d4e3f1c2a0d7e8a9c6b1e0d3f4a1b8c7d2e5a0b9d8e1c2f3d4b5a6';
8+
9+
public function login() {
10+
$data = json_decode(file_get_contents('php://input'), true);
11+
$email = $data['email'];
12+
$password = $data['senha'];
13+
14+
$user = new UserModel;
15+
$result = $user->checkCredentials($email, $password);
16+
17+
if ($result['success']) {
18+
$payload = [
19+
'iat' => time(),
20+
'exp' => time() + 3600,
21+
'data' => [
22+
'id' => $result['user_id'],
23+
'email' => $email
24+
]
25+
];
26+
$jwt = $this->encodeJWT($payload);
27+
echo json_encode([
28+
'message' => 'Login feito com sucesso',
29+
'token' => $jwt
30+
]);
31+
} else {
32+
http_response_code(401);
33+
echo json_encode(['message' => $result['message']]);
34+
}
35+
}
36+
37+
private function encodeJWT($payload) {
38+
$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
39+
$payload = json_encode($payload);
40+
41+
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
42+
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
43+
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $this->secretKey, true);
44+
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
45+
46+
return $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
47+
}
48+
49+
public function validateJWT($jwt) {
50+
$tokenParts = explode('.', $jwt);
51+
$header = base64_decode($tokenParts[0]);
52+
$payload = base64_decode($tokenParts[1]);
53+
$signatureProvided = $tokenParts[2];
54+
55+
$expiration = json_decode($payload)->exp;
56+
$isTokenExpired = ($expiration - time()) < 0;
57+
58+
$base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
59+
$base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload));
60+
$signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $this->secretKey, true);
61+
$base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
62+
63+
$isSignatureValid = ($base64UrlSignature === $signatureProvided);
64+
65+
if ($isTokenExpired || !$isSignatureValid) {
66+
return false;
67+
}
68+
69+
return json_decode($payload);
70+
}
71+
}

App/Controllers/UserController.php

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
3+
namespace App\Controllers;
4+
5+
use App\Models\UserModel;
6+
7+
class UserController {
8+
9+
public function get($id) {
10+
try {
11+
$user = new UserModel;
12+
$userData = $user->read($id);
13+
if (!$userData) {
14+
http_response_code(404);
15+
echo json_encode(['error' => 'Usuario nao encontrado']);
16+
return;
17+
}
18+
http_response_code(200);
19+
echo json_encode(['Dados do usuario' => $userData]);
20+
} catch (\Exception $e) {
21+
http_response_code(500);
22+
echo json_encode(['error' => $e->getMessage()]);
23+
}
24+
}
25+
26+
public function post() {
27+
try {
28+
$data = $this->getJsonBody();
29+
$user = new UserModel;
30+
$createdUserId = $user->create($data);
31+
if ($createdUserId !== null) {
32+
http_response_code(201);
33+
echo json_encode(['message' => 'Usuario cadastrado com sucesso', 'id' => $createdUserId]);
34+
} else {
35+
http_response_code(400);
36+
echo json_encode(['message' => 'Falha ao cadastrar usuario']);
37+
}
38+
} catch (\Exception $e) {
39+
http_response_code(500);
40+
echo json_encode(['error' => $e->getMessage()]);
41+
}
42+
}
43+
44+
public function put($id) {
45+
try {
46+
$data = $this->getJsonBody();
47+
$user = new UserModel;
48+
if ($user->update($data, $id)) {
49+
http_response_code(204);
50+
echo json_encode(['message' => 'Usuario atualizado com sucesso']);
51+
} else {
52+
http_response_code(400);
53+
echo json_encode(['message' => 'Falha ao atualizar usuario']);
54+
}
55+
} catch (\Exception $e) {
56+
http_response_code(500);
57+
echo json_encode(['error' => $e->getMessage()]);
58+
}
59+
}
60+
61+
public function delete($id) {
62+
try {
63+
$user = new UserModel;
64+
if ($user->delete($id)) {
65+
http_response_code(201);
66+
echo json_encode(['message' => 'Usuario deletado com sucesso']);
67+
} else {
68+
http_response_code(400);
69+
echo json_encode(['message' => 'Falha ao deletar o usuario']);
70+
}
71+
} catch (\Exception $e) {
72+
http_response_code(500);
73+
echo json_encode(['error' => $e->getMessage()]);
74+
}
75+
}
76+
77+
// Valida o JSON recebido pela requisição
78+
private function getJsonBody() {
79+
$data = json_decode(file_get_contents('php://input'), true);
80+
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
81+
throw new \Exception('Dados invalidos no corpo da requisicao');
82+
}
83+
return $data;
84+
}
85+
}

0 commit comments

Comments
 (0)