Cadastre seus clientes e os gerencie através de uma interface simples e amigável.
- Crie seus clientes, registrando seu E-mail, CPF e Telefone
- Explore os dados registrados por meio de filtros e ordenações
- Obtenha seus clientes no formato mais famoso para integrações: JSON
- PHP 8
- Symfony 5
- Postgres 13
- SQLite 3
- Aplicado uso de cache para agilizar consultas
- PHPUnit para realizar testes de integração e unitários ( todos passando :) )
- Na infraestrutura, para banco de dados foi utilizado o ORM doctrine para operar os repositórios
- Também foi utilizado Postman para testes das rotas
- Para o repositório git, segui a convenção do framework Angular
- Instale o PHP 8
- Instale o Postgres 13
- Instale o Composer 2
- Instale o Git
Clone o repositório
git clone [email protected]:dalissongabriel/test_php_backend_cuco.git
Dentro da pasta do projeto, crie suas variáveis de ambiente baseado no exemplo: .env.example
cp .env.example .env
DATABASE_URL="postgresql://SEU_USUARIO:SUA_SENHA@HOST_DO_BANCO:PORTA_DO_BANCO/NOME_DO_BANCO?serverVersion=13&charset=utf8"
Baixe as dependências com o composer:
composer install
Crie o banco de dados
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate
Popule o banco com as seeds
php bin/console doctrine:fixtures:load
Suba o servidor para rodar a aplicação:
php -S localhost:8081 -t public/
Execute o comando para criar a base de dados teste em SQLite 3:
php bin/console -e test doctrine:schema:create
Execute o comando para popular as seeds na base de testes:
php bin/console doctrine:fixtures:load --env=test
Em seguida, rode testes feitos em PHPUnit
php bin/phpunit
Testes passando!!!
OK (24 tests, 47 assertions)
-
Usuário deve poder criar um cliente informando: nome, e-mail, cpf. Opcionalmente, pode-se informar também o telefone.
-
Usuário deve poder deletar um cliente
-
Usuário deve poder editar um cliente
-
Usuário deve poder buscar um cliente pelo nome e/ou CPF
-
Todos os retornos da API devem ser em JSON, incluindo os erros tratados pela aplicação
BONUS
-
Cliente deverá se autenticar via token JWT para ter acesso as rotas
-
Cliente poderá filtrar os registros por email
-
Cliente deverá receber respostas com informações extras sobre os recursos consultados (HATEOAS)
-
Cliente poderá escolher a ordenação de sua busca
-
Cliente deverá receber respostas páginadas, e poderá escolher qual página gostaria de receber, assim como a quantidade de registros por página
-
Os campos CPF,Telefone e E-mail devem ser válidados para garantir a integridade do domínio
Esta é um API RESTful com um contexto bem enxuto, todavia, para a construção da mesma, utilizei boas práticas de programação e teste unitários para entregar um ferramenta de fácil manutenção e evolução. Para facilitar ainda mais a utilização da mesma, disponibilizo abaixo uma relação completa de uso das rotas, e também uma coleção do postmam. Faça bom uso :)
Documentação completa para consumo da API:
-
Obter Token de acesso (Rota não protegida)
Esta rota autentica um usuário e retona um token JWT válido para utilizar nas demais requisições. Somente um usuário foi adicionado por meio de seeds (Fixtures)
-
Request
POST http://localhost:8081/login
-
Exemplos de um bom Body
{ "username": "my-valid-user-login", "password": "my-valid=password-login" } -
Retornos possíveis
Código Resposta 200 (OK)Login processado com sucesso400 (Requisição inválida)A requisição realizada contém problemas de má formação401 (Não autorizado)Usuário ou senha incorretos -
Response
{ "success": true, "data": { "access_token": "aqui estará seu token para acesso" } }{ "success": false, "data": { "message": "Usuário ou senha inválidos" }
-
-
Adicionar clientes (Rota protegida)
Esta rota insere um novo registro na tabela client.
-
Request
POST http://localhost:8081/clientes
-
Header
AUTHORIZATION {ACCESS_TOKEN -
Exemplos de um bom Body
{ "name": "Otavio Mota", "email": "[email protected]", "cpf": "123.456.789.9" }{ "name": "Otavio Mota", "email": "[email protected]", "cpf": "123.456.789.9", "phone": "(40) 404044040" } -
Retornos possíveis
Código Resposta 201 (Criado)Cliente cadastrado400 (Requisição inválida)A requisição realizada contém problemas de má formação401 (Não autorizado)Na requisição, não foi informado o cabeçalho de autorização412 (Pré-condição falhou)Os valores informados não são válidos.
-
-
Buscar cliente (Rota protegida)
Esta rota busca um registro na tabela client pelo ID.
-
Request
GET http://localhost:8081/clientes/{id} -
Header
AUTHORIZATION {ACCESS_TOKEN} -
Retornos possíveis
Código Resposta 200 (Ok)Requisição processada com sucesso400 (Requisição inválida)A requisição realizada contém problemas de má formação401 (Não autorizado)Na requisição, não foi informado o cabeçalho de autorização -
Exemplos
- Request
{ "name":"Teste 3", "cpf":"278.128.110-77", "email":"[email protected]" } - Header
AUTHORIZATION {ACCESS_TOKEN - Response
{ "success": true, "data": { "id": 20, "name": "Teste 3", "cpf": "278.128.110-77", "email": "[email protected]" } }
- Request
-
-
Buscar todos os clientes (Rota protegida)
Esta rota busca registros na tabela client, podendo realizar buscas personalizadas.
-
Request
GET http://localhost:8081/clientes
-
Header
AUTHORIZATION {ACCESS_TOKEN} -
Filtros, ordenação e paginação:
Opções Função /clientes?name=Teste 3filtra por nome/clientes?cpf="123.456.789-9filtra por cpf/clientes?name=Teste 3cpf=123.456.789-9filtra por nome e cpf/clientes?sort[name]=ASCordena em ascendente por nome/clientes?sort[name]=DESCordena em descendente por nome/clientes?sort[name]=DESC&sort[id]=ASCordena em descendente por nome e depois por ID em ascendente/clientes?page=2retorna a 2ª página de dados/clientes?page=2&itemsPerPage=20retorna a 2ª página de dados, exibindo 20 items -
Retornos possíveis
Código Resposta 200 (Ok)Requisição processada com sucesso400 (Requisição inválida)A requisição realizada contém problemas de má formação401 (Não autorizado)Na requisição, não foi informado o cabeçalho de autorização -
Response
{ "success": true, "currentPage": 1, "itemsPerPage": 5, "data": [] }{ "success": true, "currentPage": 1, "itemsPerPage": 5, "data": [ { "id": 17, "name": "Client Test 1", "cpf": "446.069.350-06", "email": "[email protected]", "phone": null }, { "id": 18, "name": "Client Test 2", "cpf": "949.487.580-00", "email": "[email protected]", "phone": null }, { "id": 19, "name": "Teste 3", "cpf": "278.128.110-77", "email": "[email protected]", "phone": null }, { "id": 20, "name": "Teste 3", "cpf": "278.128.110-77", "email": "[email protected]", "phone": null } ] }
-
-
Atualizar dados de um cliente (Rota protegida)
Esta rota atualiza um registro na tabela client pelo ID.
-
Request
PUT http://localhost:8081/clientes/{id} -
Header
AUTHORIZATION {ACCESS_TOKEN} -
Retornos possíveis
Código Resposta 200 (Atualizado)Cliente atualizado com sucesso400 (Requisição inválida)A requisição realizada contém problemas de má formação401 (Não autorizado)Na requisição, não foi informado o cabeçalho de autorização404 (Não encontrado)Recurso com o {id} não encontrado na base412 (Pré-condição falhou)Os valores informados não são válidos.
-
-
Remover um cliente (Rota protegida)
Esta rota remove um registro na tabela client pelo ID.
-
Request
DELETE http://localhost:8081/clientes/{id} -
Header
AUTHORIZATION {ACCESS_TOKEN} -
Retornos possíveis
Código Resposta 204 (Nenhum conteúdo)Cliente apagado401 (Não autorizado)Na requisição, não foi informado o cabeçalho de autorização404 (Não encontrado)Recurso com o {id} não encontrado na base
-
Projeto concluído em 2021
Feito com carinho por Alisson Gabriel
