Basicamente este deafio se baseou em duas tarefas: Desenvolver um sistema de CRON e uma REST API.
A idéia do sistema de cron era desenvolver uma funcionalidade que importasse para a base de dados a versão mais recente do Open Food Facts uma vez ao dia. Permitindo ao usuário definir o melhor horário para realizar a atualização.
Já a REST API tinha como objetivo desenvolver um CRUD com os produtos importados pelo sistema de cron. os endpoints seriam:
GET /products
: Listar os produtos da base de dados de forma paginada.GET /products/:code
: Listar um produto da base de dados.PUT /products/:code
: Atualizar informaçõesde um produto da base de dados.DELETE /products/:code
: Mudar o status de um produto paratrash
.
Ainda estou tentando fazer algumas melhorias no projeto
O sistema de cron desenvolvido funciona da seguinte forma:
- O sistema acessa a API do Open Food e recebe uma lista de produtos que deve importar.
- A partir daí este processamento é enviado para uma fila, onde os produtos são enviados para a base de dados, como este processamento é assincrono o usuário não tem que esperar acabar e pode continuar usando os sistema.
- Quando finalizado o processo os administradores são notificados por email, caso ocorra algum erro eles também são notificados.
- Como solicitado no desafio o sistema é executado uma vez ao dia em um horário definido pelo usuário através da variável de ambiente
CRON_RUN_AT
. - Também é possível executar o cron através do terminal utilizando o comando
./vendor/bin/sail artisan cron:work
.
A documentação pode ser acessada
aqui
Atualmente o sistema possui 2 endpoints principais, um endpoint de usuários e outro de produtos, os dois possuem as funcionalidades básicas de um CRUD. Para estes endpoints desenvolvi também testes automatizados utilizando phpunit.
Endpoints relacionados a usuários:
Método | URI | Descrição |
---|---|---|
GET | /api/users | retorna todos os usuários da base de dados |
GET | /api/users/{user} | retorna um usuário da base de dados |
PUT | /api/users/{user} | atualiza um usuário da base de dados |
DELETE | /api/users/{user} | apaga um usuário da base de dados |
Endpoints relacionados a produtos:
Método | URI | Descrição |
---|---|---|
GET | /api/products | retorna todos os produtos da base de dados |
GET | /api/products/{user} | retorna um produto da base de dados |
PUT | /api/products/{user} | atualiza um produto da base de dados |
DELETE | /api/products/{user} | apaga um produto da base de dados |
Faça o clone do respositório
git clone https://github.com/Ronildo-Sousa/php-challenge.git
Na pasta do projeto instale as dependências
docker run --rm \
-u "$(id -u):$(id -g)" \
-v $(pwd):/var/www/html \
-w /var/www/html \
laravelsail/php81-composer:latest \
composer install --ignore-platform-reqs
Crie o arquivo .env
cp .env.example .env
Inicialize o container do Laravel Sail
./vendor/bin/sail up -d
Crie a chave da aplicação
./vendor/bin/sail artisan key:generate
Execute as migrations e seeders
./vendor/bin/sail artisan migrate --seed