├── .editorconfig ├── .gitignore ├── App ├── Controllers │ ├── .gitkeep │ ├── AuthController.php │ ├── ExceptionController.php │ ├── LojaController.php │ └── ProdutoController.php ├── DAO │ ├── .gitkeep │ └── MySQL │ │ └── CodeeasyGerenciadorDeLojas │ │ ├── Conexao.php │ │ ├── LojasDAO.php │ │ ├── ProdutosDAO.php │ │ ├── TokensDAO.php │ │ └── UsuariosDAO.php ├── Exceptions │ └── TestException.php ├── Middlewares │ └── .gitkeep └── Models │ ├── .gitkeep │ └── MySQL │ └── CodeeasyGerenciadorDeLojas │ ├── LojaModel.php │ ├── ProdutoModel.php │ ├── TokenModel.php │ └── UsuarioModel.php ├── README.md ├── composer.json ├── docker-compose.yml ├── env.example.php ├── index.php ├── routes └── index.php ├── sql ├── all.sql ├── create_database_and_tables.sql ├── create_users_table.sql ├── deletes.sql ├── insert_users.sql ├── inserts.sql ├── selects.sql └── updates.sql └── src ├── basicAuth.php ├── jwtAuth.php └── slimConfiguration.php /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.{yml,json}] 12 | indent_size = 2 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | .buildpath 3 | .project 4 | .settings/ 5 | composer.lock 6 | env.php 7 | composer.phar 8 | .vscode/ 9 | -------------------------------------------------------------------------------- /App/Controllers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeeasy-dev/apis-rest-com-php-7-e-slim-framework/7e1f4c607b83a8efa0a13d7b055112801c4c9011/App/Controllers/.gitkeep -------------------------------------------------------------------------------- /App/Controllers/AuthController.php: -------------------------------------------------------------------------------- 1 | getParsedBody(); 17 | 18 | $email = $data['email']; 19 | $senha = $data['senha']; 20 | $expireDate = $data['expire_date']; 21 | 22 | $usuariosDAO = new UsuariosDAO(); 23 | $usuario = $usuariosDAO->getUserByEmail($email); 24 | 25 | if (is_null($usuario)) { 26 | return $response->withStatus(401); 27 | } 28 | 29 | if (!password_verify($senha, $usuario->getSenha())) { 30 | return $response->withStatus(401); 31 | } 32 | 33 | $tokenPayload = [ 34 | 'sub' => $usuario->getId(), 35 | 'name' => $usuario->getNome(), 36 | 'email' => $usuario->getEmail(), 37 | 'exp' => (new \DateTime($expireDate))->getTimestamp() 38 | ]; 39 | 40 | $token = JWT::encode($tokenPayload, getenv('JWT_SECRET_KEY')); 41 | $refreshTokenPayload = [ 42 | 'email' => $usuario->getEmail(), 43 | 'ramdom' => uniqid() 44 | ]; 45 | $refreshToken = JWT::encode($refreshTokenPayload, getenv('JWT_SECRET_KEY')); 46 | 47 | $tokenModel = new TokenModel(); 48 | $tokenModel->setExpired_at($expireDate) 49 | ->setRefresh_token($refreshToken) 50 | ->setToken($token) 51 | ->setUsuarios_id($usuario->getId()); 52 | 53 | $tokensDAO = new TokensDAO(); 54 | $tokensDAO->createToken($tokenModel); 55 | 56 | $response = $response->withJson([ 57 | "token" => $token, 58 | "refresh_token" => $refreshToken 59 | ]); 60 | 61 | return $response; 62 | } 63 | 64 | public function refreshToken(Request $request, Response $response, array $args): Response 65 | { 66 | $data = $request->getParsedBody(); 67 | $refreshToken = $data['refresh_token']; 68 | $expireDate = $data['expire_date']; 69 | 70 | $refreshTokenDecoded = JWT::decode( 71 | $refreshToken, 72 | getenv('JWT_SECRET_KEY'), 73 | ['HS256'] 74 | ); 75 | 76 | $tokensDAO = new TokensDAO(); 77 | $refreshTokenExists = $tokensDAO->verifyRefreshToken($refreshToken); 78 | if (!$refreshTokenExists) { 79 | return $response->withStatus(401); 80 | } 81 | $usuariosDAO = new UsuariosDAO(); 82 | $usuario = $usuariosDAO->getUserByEmail($refreshTokenDecoded->email); 83 | if (is_null($usuario)) { 84 | return $response->withStatus(401); 85 | } 86 | 87 | $tokenPayload = [ 88 | 'sub' => $usuario->getId(), 89 | 'name' => $usuario->getNome(), 90 | 'email' => $usuario->getEmail(), 91 | 'expired_at' => $expireDate 92 | ]; 93 | 94 | $token = JWT::encode($tokenPayload, getenv('JWT_SECRET_KEY')); 95 | $refreshTokenPayload = [ 96 | 'email' => $usuario->getEmail(), 97 | 'ramdom' => uniqid() 98 | ]; 99 | $refreshToken = JWT::encode($refreshTokenPayload, getenv('JWT_SECRET_KEY')); 100 | 101 | $tokenModel = new TokenModel(); 102 | $tokenModel->setExpired_at($expireDate) 103 | ->setRefresh_token($refreshToken) 104 | ->setToken($token) 105 | ->setUsuarios_id($usuario->getId()); 106 | 107 | $tokensDAO = new TokensDAO(); 108 | $tokensDAO->createToken($tokenModel); 109 | 110 | $response = $response->withJson([ 111 | "token" => $token, 112 | "refresh_token" => $refreshToken 113 | ]); 114 | 115 | return $response; 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /App/Controllers/ExceptionController.php: -------------------------------------------------------------------------------- 1 | withJson(['msg' => 'ok']); 17 | } catch(TestException $ex) { 18 | return $response->withJson([ 19 | 'error' => TestException::class, 20 | 'status' => 400, 21 | 'code' => '003', 22 | 'userMessage' => "Testando apenas...", 23 | 'developerMessage' => $ex->getMessage() 24 | ], 400); 25 | } catch(\InvalidArgumentException $ex) { 26 | return $response->withJson([ 27 | 'error' => \InvalidArgumentException::class, 28 | 'status' => 400, 29 | 'code' => '002', 30 | 'userMessage' => "É necessário enviar todos os dados para o login.", 31 | 'developerMessage' => $ex->getMessage() 32 | ], 400); 33 | } catch(\Exception | \Throwable $ex) { 34 | return $response->withJson([ 35 | 'error' => \Exception::class, 36 | 'status' => 500, 37 | 'code' => '001', 38 | 'userMessage' => "Erro na aplicação, entre em contato com o administrador do sistema.", 39 | 'developerMessage' => $ex->getMessage() 40 | ], 500); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /App/Controllers/LojaController.php: -------------------------------------------------------------------------------- 1 | lojasDAO = $container->offsetGet(LojasDAO::class); 19 | } 20 | 21 | public function getLojas(Request $request, Response $response, array $args): Response 22 | { 23 | $lojas = $this->lojasDAO->getAllLojas(); 24 | $response->getBody()->write( 25 | json_encode( 26 | $lojas, 27 | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE 28 | ) 29 | ); 30 | 31 | return $response 32 | ->withHeader('Content-Type', 'application/json') 33 | ->withStatus(200); 34 | } 35 | 36 | public function insertLoja(Request $request, Response $response, array $args): Response 37 | { 38 | $data = $request->getParsedBody(); 39 | 40 | $lojasDAO = new LojasDAO(); 41 | $loja = new LojaModel(); 42 | $loja->setNome($data['nome']) 43 | ->setEndereco($data['endereco']) 44 | ->setTelefone($data['telefone']); 45 | $lojasDAO->insertLoja($loja); 46 | 47 | $response = $response->withJson([ 48 | 'message' => 'Loja inserida com sucesso!' 49 | ]); 50 | 51 | return $response; 52 | } 53 | 54 | public function updateLoja(Request $request, Response $response, array $args): Response 55 | { 56 | $data = $request->getParsedBody(); 57 | 58 | $lojasDAO = new LojasDAO(); 59 | $loja = new LojaModel(); 60 | $loja->setId((int)$data['id']) 61 | ->setNome($data['nome']) 62 | ->setEndereco($data['endereco']) 63 | ->setTelefone($data['telefone']); 64 | $lojasDAO->updateLoja($loja); 65 | 66 | $response = $response->withJson([ 67 | 'message' => 'Loja alterada com sucesso!' 68 | ]); 69 | 70 | return $response; 71 | } 72 | 73 | public function deleteLoja(Request $request, Response $response, array $args): Response 74 | { 75 | $queryParams = $request->getQueryParams(); 76 | 77 | $lojasDAO = new LojasDAO(); 78 | $id = (int)$queryParams['id']; 79 | $lojasDAO->deleteLoja($id); 80 | 81 | $response = $response->withJson([ 82 | 'message' => 'Loja excluída com sucesso!' 83 | ]); 84 | 85 | return $response; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /App/Controllers/ProdutoController.php: -------------------------------------------------------------------------------- 1 | getQueryParams(); 14 | 15 | $produtosDAO = new ProdutosDAO(); 16 | $id = (int)$queryParams['loja_id']; 17 | $produtos = $produtosDAO->getAllProdutosFromLoja($id); 18 | $response = $response->withJson($produtos); 19 | 20 | return $response; 21 | } 22 | 23 | public function insertProduto(Request $request, Response $response, array $args): Response 24 | { 25 | 26 | 27 | return $response; 28 | } 29 | 30 | public function updateProduto(Request $request, Response $response, array $args): Response 31 | { 32 | return $response; 33 | } 34 | 35 | public function deleteProduto(Request $request, Response $response, array $args): Response 36 | { 37 | return $response; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /App/DAO/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeeasy-dev/apis-rest-com-php-7-e-slim-framework/7e1f4c607b83a8efa0a13d7b055112801c4c9011/App/DAO/.gitkeep -------------------------------------------------------------------------------- /App/DAO/MySQL/CodeeasyGerenciadorDeLojas/Conexao.php: -------------------------------------------------------------------------------- 1 | pdo = new \PDO($dsn, $user, $pass); 23 | $this->pdo->setAttribute( 24 | \PDO::ATTR_ERRMODE, 25 | \PDO::ERRMODE_EXCEPTION 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /App/DAO/MySQL/CodeeasyGerenciadorDeLojas/LojasDAO.php: -------------------------------------------------------------------------------- 1 | pdo 17 | ->query('SELECT 18 | id, 19 | nome, 20 | telefone, 21 | endereco 22 | FROM lojas;') 23 | ->fetchAll(\PDO::FETCH_ASSOC); 24 | 25 | return $lojas; 26 | } 27 | 28 | public function insertLoja(LojaModel $loja): void 29 | { 30 | $statement = $this->pdo 31 | ->prepare('INSERT INTO lojas VALUES( 32 | null, 33 | :nome, 34 | :telefone, 35 | :endereco 36 | );'); 37 | $statement->execute([ 38 | 'nome' => $loja->getNome(), 39 | 'telefone' => $loja->getTelefone(), 40 | 'endereco' => $loja->getEndereco() 41 | ]); 42 | } 43 | 44 | public function updateLoja(LojaModel $loja): void 45 | { 46 | $statement = $this->pdo 47 | ->prepare('UPDATE lojas SET 48 | nome = :nome, 49 | telefone = :telefone, 50 | endereco = :endereco 51 | WHERE 52 | id = :id 53 | ;'); 54 | $statement->execute([ 55 | 'nome' => $loja->getNome(), 56 | 'telefone' => $loja->getTelefone(), 57 | 'endereco' => $loja->getEndereco(), 58 | 'id' => $loja->getId() 59 | ]); 60 | } 61 | 62 | public function deleteLoja(int $id): void 63 | { 64 | $statement = $this->pdo 65 | ->prepare('DELETE FROM produtos WHERE loja_id = :id; 66 | DELETE FROM lojas WHERE id = :id; 67 | '); 68 | $statement->execute([ 69 | 'id' => $id 70 | ]); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /App/DAO/MySQL/CodeeasyGerenciadorDeLojas/ProdutosDAO.php: -------------------------------------------------------------------------------- 1 | pdo 15 | ->prepare('SELECT 16 | * 17 | FROM produtos 18 | WHERE 19 | loja_id = :loja_id 20 | ;'); 21 | $statement->bindParam(':loja_id', $lojaId, \PDO::PARAM_INT); 22 | $statement->execute(); 23 | $produtos = $statement->fetchAll(\PDO::FETCH_ASSOC); 24 | 25 | return $produtos; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /App/DAO/MySQL/CodeeasyGerenciadorDeLojas/TokensDAO.php: -------------------------------------------------------------------------------- 1 | pdo 17 | ->prepare('INSERT INTO tokens 18 | ( 19 | token, 20 | refresh_token, 21 | expired_at, 22 | usuarios_id 23 | ) 24 | VALUES 25 | ( 26 | :token, 27 | :refresh_token, 28 | :expired_at, 29 | :usuarios_id 30 | ); 31 | '); 32 | $statement->execute([ 33 | 'token' => $token->getToken(), 34 | 'refresh_token' => $token->getRefresh_token(), 35 | 'expired_at' => $token->getExpired_at(), 36 | 'usuarios_id' => $token->getUsuarios_id() 37 | ]); 38 | } 39 | 40 | public function verifyRefreshToken(string $refreshToken): bool 41 | { 42 | $statement = $this->pdo 43 | ->prepare('SELECT 44 | id 45 | FROM tokens 46 | WHERE refresh_token = :refresh_token; 47 | '); 48 | $statement->bindParam('refresh_token', $refreshToken); 49 | $statement->execute(); 50 | $tokens = $statement->fetchAll(\PDO::FETCH_ASSOC); 51 | return count($tokens) === 0 ? false : true; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /App/DAO/MySQL/CodeeasyGerenciadorDeLojas/UsuariosDAO.php: -------------------------------------------------------------------------------- 1 | pdo 18 | ->prepare('SELECT 19 | id, 20 | nome, 21 | email, 22 | senha 23 | FROM usuarios 24 | WHERE email = :email; 25 | '); 26 | $statement->bindParam('email', $email); 27 | $statement->execute(); 28 | $usuarios = $statement->fetchAll(\PDO::FETCH_ASSOC); 29 | if(count($usuarios) === 0) 30 | return null; 31 | $usuario = new UsuarioModel(); 32 | $usuario->setId($usuarios[0]['id']) 33 | ->setNome($usuarios[0]['nome']) 34 | ->setEmail($usuarios[0]['email']) 35 | ->setSenha($usuarios[0]['senha']); 36 | return $usuario; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /App/Exceptions/TestException.php: -------------------------------------------------------------------------------- 1 | code}]: {$this->message}\n"; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /App/Middlewares/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeeasy-dev/apis-rest-com-php-7-e-slim-framework/7e1f4c607b83a8efa0a13d7b055112801c4c9011/App/Middlewares/.gitkeep -------------------------------------------------------------------------------- /App/Models/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeeasy-dev/apis-rest-com-php-7-e-slim-framework/7e1f4c607b83a8efa0a13d7b055112801c4c9011/App/Models/.gitkeep -------------------------------------------------------------------------------- /App/Models/MySQL/CodeeasyGerenciadorDeLojas/LojaModel.php: -------------------------------------------------------------------------------- 1 | id; 30 | } 31 | 32 | public function setId(int $id): LojaModel 33 | { 34 | $this->id = $id; 35 | return $this; 36 | } 37 | 38 | /** 39 | * @return string 40 | */ 41 | public function getNome(): string 42 | { 43 | return $this->nome; 44 | } 45 | /** 46 | * @param string $nome 47 | * @return LojaModel 48 | */ 49 | public function setNome(string $nome): LojaModel 50 | { 51 | $this->nome = $nome; 52 | return $this; 53 | } 54 | 55 | /** 56 | * @return string 57 | */ 58 | public function getTelefone(): string 59 | { 60 | return $this->telefone; 61 | } 62 | /** 63 | * @param string $telefone 64 | * @return LojaModel 65 | */ 66 | public function setTelefone(string $telefone): LojaModel 67 | { 68 | $this->telefone = $telefone; 69 | return $this; 70 | } 71 | 72 | /** 73 | * @return string 74 | */ 75 | public function getEndereco(): string 76 | { 77 | return $this->endereco; 78 | } 79 | /** 80 | * @param string $endereco 81 | * @return LojaModel 82 | */ 83 | public function setEndereco(string $endereco): LojaModel 84 | { 85 | $this->endereco = $endereco; 86 | return $this; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /App/Models/MySQL/CodeeasyGerenciadorDeLojas/ProdutoModel.php: -------------------------------------------------------------------------------- 1 | id; 34 | } 35 | /** 36 | * @param int $id 37 | * @return ProdutoModel 38 | */ 39 | public function setId(int $id): ProdutoModel 40 | { 41 | $this->id = $id; 42 | return $this; 43 | } 44 | 45 | // TODO: Terminar de montar o model 46 | } 47 | -------------------------------------------------------------------------------- /App/Models/MySQL/CodeeasyGerenciadorDeLojas/TokenModel.php: -------------------------------------------------------------------------------- 1 | id; 34 | } 35 | 36 | /** 37 | * @param int $id 38 | * @return self 39 | */ 40 | public function setId(int $id): self 41 | { 42 | $this->id = $id; 43 | return $this; 44 | } 45 | 46 | /** 47 | * @return string 48 | */ 49 | public function getToken(): string 50 | { 51 | return $this->token; 52 | } 53 | 54 | /** 55 | * @param string $token 56 | * @return self 57 | */ 58 | public function setToken(string $token): self 59 | { 60 | $this->token = $token; 61 | return $this; 62 | } 63 | 64 | /** 65 | * @return string 66 | */ 67 | public function getRefresh_token(): string 68 | { 69 | return $this->refresh_token; 70 | } 71 | 72 | /** 73 | * @param string $refresh_token 74 | * @return self 75 | */ 76 | public function setRefresh_token(string $refresh_token): self 77 | { 78 | $this->refresh_token = $refresh_token; 79 | return $this; 80 | } 81 | 82 | /** 83 | * @return string 84 | */ 85 | public function getExpired_at(): string 86 | { 87 | return $this->expired_at; 88 | } 89 | 90 | /** 91 | * @param string $expired_at 92 | * @return self 93 | */ 94 | public function setExpired_at(string $expired_at): self 95 | { 96 | $this->expired_at = $expired_at; 97 | return $this; 98 | } 99 | 100 | /** 101 | * @return int 102 | */ 103 | public function getUsuarios_id(): int 104 | { 105 | return $this->usuarios_id; 106 | } 107 | 108 | /** 109 | * @param int $usuarios_id 110 | * @return self 111 | */ 112 | public function setUsuarios_id(int $usuarios_id): self 113 | { 114 | $this->usuarios_id = $usuarios_id; 115 | return $this; 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /App/Models/MySQL/CodeeasyGerenciadorDeLojas/UsuarioModel.php: -------------------------------------------------------------------------------- 1 | id; 30 | } 31 | 32 | /** 33 | * @param int $id 34 | * @return self 35 | */ 36 | public function setId(int $id): self 37 | { 38 | $this->id = $id; 39 | return $this; 40 | } 41 | 42 | /** 43 | * @return string 44 | */ 45 | public function getNome(): string 46 | { 47 | return $this->nome; 48 | } 49 | 50 | /** 51 | * @param string $nome 52 | * @return self 53 | */ 54 | public function setNome(string $nome): self 55 | { 56 | $this->nome = $nome; 57 | return $this; 58 | } 59 | 60 | /** 61 | * @return string 62 | */ 63 | public function getEmail(): string 64 | { 65 | return $this->email; 66 | } 67 | 68 | /** 69 | * @param string $email 70 | * @return self 71 | */ 72 | public function setEmail(string $email): self 73 | { 74 | $this->email = $email; 75 | return $this; 76 | } 77 | 78 | /** 79 | * @return string 80 | */ 81 | public function getSenha(): string 82 | { 83 | return $this->senha; 84 | } 85 | 86 | /** 87 | * @param string $senha 88 | * @return self 89 | */ 90 | public function setSenha(string $senha): self 91 | { 92 | $this->senha = $senha; 93 | return $this; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # APIs REST com PHP 7 e Slim Framework 2 | 3 | Material do curso 4 | 5 | * Autor: Felipe Renan Vieira 6 | * E-mail: feliperenanvieira@gmail.com 7 | * Github: [https://github.com/frv-dev](https://github.com/frv-dev) 8 | * Site: [https://codeeasy.com.br](https://www.codeeasy.com.br) 9 | * Chat: [https://gitter.im/frv-dev/CodeEasy](https://gitter.im/frv-dev/CodeEasy) 10 | 11 | ## CONFIGURAÇÃO 12 | 13 | Copie o arquivo `env.example.php` para `env.php` e preencha com as informações necessárias. 14 | 15 | Rode no terminal `composer install` ou `php composer.phar install` dependendo de como você usa o composer. 16 | 17 | Use os códigos no diretório `sql/` para criar o seu banco de dados trabalhando com o SGBD MySQL. 18 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "php": "^7.3", 4 | "slim/slim": "^3.0", 5 | "tuupola/slim-basic-auth": "^3.2", 6 | "tuupola/slim-jwt-auth": "^3.2", 7 | "squizlabs/php_codesniffer": "^3.5" 8 | }, 9 | "autoload": { 10 | "psr-4": { 11 | "App\\": "App" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | 3 | services: 4 | database: 5 | image: mysql:5.7 6 | ports: 7 | - 3308:3306 8 | environment: 9 | MYSQL_ROOT_PASSWORD: root 10 | 11 | adminer: 12 | image: adminer 13 | ports: 14 | - 8080:8080 15 | links: 16 | - database 17 | -------------------------------------------------------------------------------- /env.example.php: -------------------------------------------------------------------------------- 1 | get('/', function () { 21 | echo 'oi'; 22 | }); 23 | 24 | $app->group('/v1', function () use ($app) { 25 | $app->get('/test-with-versions', function () { 26 | return "oi v1"; 27 | }); 28 | }); 29 | 30 | $app->group('/v2', function () use ($app) { 31 | $app->get('/test-with-versions', function () { 32 | return "oi v2"; 33 | }); 34 | }); 35 | 36 | $app->get('/exception-test', ExceptionController::class . ':test'); 37 | 38 | $app->post('/login', AuthController::class . ':login'); 39 | $app->post('/refresh-token', AuthController::class . ':refreshToken'); 40 | 41 | $app->get('/teste', function () { 42 | echo "oi"; 43 | })->add(jwtAuth()); 44 | 45 | $app->group('', function () use ($app) { 46 | $app->get('/loja', LojaController::class . ':getLojas'); 47 | $app->post('/loja', LojaController::class . ':insertLoja'); 48 | $app->put('/loja', LojaController::class . ':updateLoja'); 49 | $app->delete('/loja', LojaController::class . ':deleteLoja'); 50 | 51 | $app->get('/produto', ProdutoController::class . ':getProdutos'); 52 | $app->post('/produto', ProdutoController::class . ':insertProduto'); 53 | $app->put('/produto', ProdutoController::class . ':updateProduto'); 54 | $app->delete('/produto', ProdutoController::class . ':deleteProduto'); 55 | })->add(basicAuth()); 56 | 57 | // ========================================= 58 | 59 | $app->run(); 60 | -------------------------------------------------------------------------------- /sql/all.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE codeeasy_gerenciador_de_lojas CHARACTER SET utf8 COLLATE utf8_general_ci; 2 | 3 | USE codeeasy_gerenciador_de_lojas; 4 | 5 | CREATE TABLE lojas ( 6 | id INT UNSIGNED NOT NULL AUTO_INCREMENT, 7 | nome VARCHAR(100) NOT NULL, 8 | telefone VARCHAR(13) NOT NULL, 9 | endereco VARCHAR(200) NOT NULL, 10 | PRIMARY KEY(id) 11 | ); 12 | 13 | CREATE TABLE produtos ( 14 | id INT UNSIGNED NOT NULL AUTO_INCREMENT, 15 | loja_id INT UNSIGNED NOT NULL, 16 | nome VARCHAR(100) NOT NULL, 17 | preco DECIMAL NOT NULL, 18 | quantidade INT UNSIGNED NOT NULL, 19 | PRIMARY KEY(id), 20 | CONSTRAINT fk_produtos_loja_id_lojas_id 21 | FOREIGN KEY (loja_id) REFERENCES lojas(id) 22 | ); 23 | 24 | CREATE TABLE usuarios ( 25 | id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 26 | nome VARCHAR(200) NOT NULL, 27 | email VARCHAR(200) UNIQUE NOT NULL, 28 | senha VARCHAR(200) NOT NULL 29 | ); 30 | 31 | CREATE TABLE tokens ( 32 | id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 33 | usuarios_id INT UNSIGNED NOT NULL, 34 | token VARCHAR(1000) NOT NULL, 35 | refresh_token VARCHAR(1000) NOT NULL, 36 | expired_at DATETIME NOT NULL, 37 | active TINYINT UNSIGNED NOT NULL DEFAULT 1, 38 | CONSTRAINT fk_tokens_usuarios_id_usuarios_id 39 | FOREIGN KEY (usuarios_id) REFERENCES usuarios(id) 40 | ); 41 | 42 | INSERT INTO lojas (nome, telefone, endereco) 43 | VALUES ('codeeasy', '0000-0000', 'Rua CE'); 44 | 45 | INSERT INTO produtos (loja_id, nome, preco, quantidade) 46 | VALUES (1, 'teclado', 40.00, 20); 47 | 48 | INSERT INTO usuarios ( 49 | nome, 50 | email, 51 | senha 52 | ) VALUES ( 53 | 'User 01', 54 | 'user@gmail.com', 55 | '$argon2i$v=19$m=1024,t=2,p=2$WDF5RHJLTTJaWm41Y003OA$mlfnDCyPXqcg7AkShT9wocgt7SFIRfGDw0cy8OpzXN0' 56 | ); 57 | -------------------------------------------------------------------------------- /sql/create_database_and_tables.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE codeeasy_gerenciador_de_lojas CHARACTER SET utf8 COLLATE utf8_general_ci; 2 | 3 | USE codeeasy_gerenciador_de_lojas; 4 | 5 | CREATE TABLE lojas ( 6 | id INT UNSIGNED NOT NULL AUTO_INCREMENT, 7 | nome VARCHAR(100) NOT NULL, 8 | telefone VARCHAR(13) NOT NULL, 9 | endereco VARCHAR(200) NOT NULL, 10 | PRIMARY KEY(id) 11 | ); 12 | 13 | CREATE TABLE produtos ( 14 | id INT UNSIGNED NOT NULL AUTO_INCREMENT, 15 | loja_id INT UNSIGNED NOT NULL, 16 | nome VARCHAR(100) NOT NULL, 17 | preco DECIMAL NOT NULL, 18 | quantidade INT UNSIGNED NOT NULL, 19 | PRIMARY KEY(id), 20 | CONSTRAINT fk_produtos_loja_id_lojas_id 21 | FOREIGN KEY (loja_id) REFERENCES lojas(id) 22 | ); 23 | -------------------------------------------------------------------------------- /sql/create_users_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE usuarios ( 2 | id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 | nome VARCHAR(200) NOT NULL, 4 | email VARCHAR(200) UNIQUE NOT NULL, 5 | senha VARCHAR(200) NOT NULL 6 | ); 7 | 8 | CREATE TABLE tokens ( 9 | id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 10 | usuarios_id INT UNSIGNED NOT NULL, 11 | token VARCHAR(1000) NOT NULL, 12 | refresh_token VARCHAR(1000) NOT NULL, 13 | expired_at DATETIME NOT NULL, 14 | active TINYINT UNSIGNED NOT NULL DEFAULT 1, 15 | CONSTRAINT fk_tokens_usuarios_id_usuarios_id 16 | FOREIGN KEY (usuarios_id) REFERENCES usuarios(id) 17 | ); 18 | -------------------------------------------------------------------------------- /sql/deletes.sql: -------------------------------------------------------------------------------- 1 | DELETE FROM produtos 2 | WHERE nome = 'mouse'; 3 | -------------------------------------------------------------------------------- /sql/insert_users.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO usuarios ( 2 | nome, 3 | email, 4 | senha 5 | ) VALUES ( 6 | 'User 01', 7 | 'user@gmail.com', 8 | '$argon2i$v=19$m=1024,t=2,p=2$WDF5RHJLTTJaWm41Y003OA$mlfnDCyPXqcg7AkShT9wocgt7SFIRfGDw0cy8OpzXN0' 9 | ); 10 | -------------------------------------------------------------------------------- /sql/inserts.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO lojas (nome, telefone, endereco) 2 | VALUES ('codeeasy', '0000-0000', 'Rua CE'); 3 | 4 | INSERT INTO produtos (loja_id, nome, preco, quantidade) 5 | VALUES (1, 'teclado', 40.00, 20); 6 | -------------------------------------------------------------------------------- /sql/selects.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM lojas; 3 | 4 | SELECT * 5 | FROM produtos; 6 | 7 | SELECT 8 | lojas.nome as loja, 9 | produtos.nome as produto, 10 | produtos.preco as preco, 11 | produtos.quantidade as quantidade 12 | FROM produtos 13 | INNER JOIN lojas ON produtos.loja_id = lojas.id 14 | WHERE 15 | produtos.nome = 'teclado' 16 | ORDER BY produtos.nome 17 | ; 18 | -------------------------------------------------------------------------------- /sql/updates.sql: -------------------------------------------------------------------------------- 1 | UPDATE produtos 2 | SET 3 | nome = 'mouse', 4 | quantidade = 100 5 | WHERE 6 | nome = 'teclado' 7 | ; 8 | -------------------------------------------------------------------------------- /src/basicAuth.php: -------------------------------------------------------------------------------- 1 | [ 11 | "root" => "teste123" 12 | ] 13 | ]); 14 | } 15 | -------------------------------------------------------------------------------- /src/jwtAuth.php: -------------------------------------------------------------------------------- 1 | getenv('JWT_SECRET_KEY'), 11 | 'attribute' => 'jwt' 12 | ]); 13 | } 14 | -------------------------------------------------------------------------------- /src/slimConfiguration.php: -------------------------------------------------------------------------------- 1 | [ 11 | 'displayErrorDetails' => getenv('DISPLAY_ERRORS_DETAILS'), 12 | ], 13 | ]; 14 | 15 | $container = new \Slim\Container($configuration); 16 | 17 | $container->offsetSet(LojasDAO::class, new LojasDAO()); 18 | 19 | return $container; 20 | } 21 | --------------------------------------------------------------------------------