Esse projeto tem como objetivo resolver o seguinte desafio:
- Criar um CRUD de rotas de API para o cadastro de bolos.
- Os bolos deverão ter Nome, Peso (em gramas), Valor, Quantidade disponível e uma lista de e-mail de interessados.
- Após o cadastro de e-mails interessados, caso haja bolo disponível, o sistema deve enviar um e-mail para os interessados sobre a disponibilidade do bolo.
Pode ocorrer de 50.000 clientes se cadastrarem e o processo de envio de emails não deve ser algo impeditivo.
Para instalar o projeto em sua máquina são necessários as seguintes ferramentas:
- PHP 7.4
- Composer
- MySQL
- Docker
Primeiramente clone o repositório com o seguinte comando:
git clone https://github.com/JoaoVictorViana/clickfacil-backend-teste.git
Em seguida, entre na pasta do projeto
cd clickfacil-backend-teste
E então instale todas as dependências:
composer install
Quando finalizar a instalação, crie o arquivo .env com base no arquivo .env.example e coloque as configurações do seu banco de dados.
cp .env.example .env
Atenção: A fins de otimização e de teste, está sendo utilizando o Redis para as queues e Mailhog para o envio de e-mails.
Em seguida rode o seguinte comando para gerar a API_KEY:
php artisan key:generate
Atenção: A fins de otimização e de teste, está sendo utilizando o Redis para as queues e Mailhog para o envio de e-mails. Caso não tenham essas ferramentas em sua máquina, foi incluido neste projeto, as imagens em Docker necessárias, basta executar o comando:
docker-compose up -d
Execute também os seguintes comandos para limpar a cache:
php artisan cache:clear
php artisan config:cache
Depois de ter feito todas as configurações será necessário criar o banco de dados em sua máquina e em seguida roda o comando:
php artisan migrate
Pronto agora o projeto está pronto para ser testado!
Para resolve o desafio foi construido uma API. Segue as lista de todas as endpoints, assim como também o que é esperado como entrada e seu respectivo retorno:
-
(GET) "/api/cake": Retorna todos os bolos cadastrados.
- Retorno: HTTP/1.1 200 OK
["data": [[cake_id": 1, "name": 'Teste', "weight": 300, "price": 180.00, "quantity": 10, "emails": []]]]
-
(POST) "/api/cake": Cadastra um novo bolo.
- Data:
["name": 'Teste', "weight": 300, "price": 180.00, "quantity": 10, "list_emails": []]
- Retorno: HTTP/1.1 201 OK
["data": ["cake_id": 1, "name": 'Teste', "weight": 300, "price": 180.00, "quantity": 10, "emails": []]]
- Data:
-
(GET) "/api/cake/{id}": Busca por um específico bolo.
- Retorno: HTTP/1.1 200 OK
["data": ["cake_id": 1, "name": 'Teste', "weight": 300, "price": 180.00, "quantity": 10, "emails": []]]
-
(PUT) "/api/cake/{id}": Atualiza um específico bolo.
- Data:
["name": 'Teste Edit']
- Retorno: HTTP/1.1 200 OK
["message": "Bolo atualizado com sucesso!"]
- Data:
-
(DELETE) "/api/cake/{id}": Remove um específico bolo.
- Retorno: HTTP/1.1 200 OK
["message": "Bolo deletado com sucesso!"]
-
(GET) "/api/email": Retorna todos os emails cadastrados.
- Retorno: HTTP/1.1 200 OK
["data": ["email_interested_cake_id": 1, "cake_id_fk": 1, "email": "[email protected]"]]
-
(POST) "/api/email": Cadastra um novo e-mail.
- Data:
["cake_id_fk": 1, "email": "teste@gmail"]
- Retorno: HTTP/1.1 201 OK
["data": []]
- Data:
-
(POST) "/api/email/list": Cadastra uma lista de e-mails.
- Data:
["cake_id_fk": 1, "list_emails": ["teste@gmail"]]
- Retorno: HTTP/1.1 200 OK
["data": []]
- Data:
-
(GET) "/api/email/{id}": Busca por um específico email.
- Retorno: HTTP/1.1 200 OK
["data": ["email_interested_cake_id": 1, "cake_id_fk": 1, "email": "[email protected]"]]
-
(PUT) "/api/email/{id}": Atualiza um específico e-mail.
- Data:
["email": 'teste@teste']
- Retorno: HTTP/1.1 200 OK
["message": "E-mail atualizado com sucesso!"]
- Data:
-
(DELETE) "/api/email/{id}": Remove um específico bolo.
- Retorno: HTTP/1.1 200 OK
["message": "E-mail deletado com sucesso!"]
Antes de realizar todos os testes, fique atento a essas duas observações:
- Está sendo utilizado o Redis para processar a Queue, portanto, para testar os envios de e-mails, será necessário executar alguns dos seguintes comandos ou instale o supervisor:
- Antes de executar os testes:
php artisan queue:listen
- Depois de executar os testes:
php artisan queue:work
- Antes de executar os testes:
- Como está sendo utilizado o Redis para executar a Queue de forma asyncrona, é necessário armazenar a queue, portanto não está sendo utilizando o RefreshDatabase do Laravel. Com isso é necessário rodar o seguinte comando antes e depois de executar os testes:
php artisan migrate:fresh
E para realizar todos os testes, utilize o comando:
php artisan test
Caso tenha instalado e configurado tudo de forma correta, espera-se que todos os testes sejam concluidos com sucesso!
The Laravel framework is open-sourced software licensed under the MIT license.