This is a challenge by Coodesh
Este projeto implementa uma API REST para o Open Food Facts utilizando PHP, sem nenhum framework.
Uma explicação rápida deste projeto em vídeo pode ser encontrada aqui.
Para levantar a infraestrutura do sistema, utilize o Docker Compose:
docker-compose up
Antes de utilizar o sistema, é necessário popular seu BD. Isso pode ser feito
acessando-se a rota /cron
(veja mais sobre o disparo dos endpoints abaixo).
Cada rota deve ser chamada com base na URL http://localhost/index.php. Por exemplo, para acessar a listagem de todos os produtos, deve-se seguir para http://localhost/index.php/products.
As rotas existentes são:
- /: retorna uma mensagem de apresentação do sistema.
- /products: acessa um lista paginada de todos os produtos disponíveis no BD.
- /products/123: confere as informações do produto com código 123.
- /cron: dispara script que raspa os dados do Open Food Facts.
- /docs/api.yml: aponta para o arquivo Open API que descreve a API deste sistema.
A imagem que utilizei para o PHP/Apache é bem limitada quanto a recursos diversos. Como não tive tempo de procurar uma imagem mais completa, acabei trabalhando com esta mesma, o que me restringiu em dois pontos.
Em primeiro lugar, instalei o cron no container, e consegui colocar o daemon para funcionar. Ainda assim, ele ignorava os arquivos crontab por completo, não disparando o script de raspagem do PHP. Acabei deixando essa parte de lado, mas configurar uma tarefa para ser feita no cron é algo muito simples. Neste caso, bastaria adicionar a seguinte linha ao arquivo:
0 0 * * * php -v /var/www/html/cron.php
E o script cron.php
seria disparada todos os dias, à meia-noite.
A segunda restrição que não tive tempo de superar foi a configuração
das rotas sem o trecho index.php
. Ou seja, em vez de:
http://localhost/index.php/products
o que eu queria era:
E para isso eu precisaria editar o arquivo .htaccess
, informando:
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Infelizmente, o Apache não estava aceitando nenhuma diretiva neste arquivo,
e os logs não estão sendo coletados. Sem essa possibilidade, só me
restou manter o index.php
nas URLs.
Por entender que estas minúcias não são muito importantes para o teste, optei por ignorá-las.