Skip to content

Latest commit

 

History

History
104 lines (68 loc) · 6.09 KB

README copy.md

File metadata and controls

104 lines (68 loc) · 6.09 KB

Backend Challenge 20230105

Introdução

Nesse desafio trabalharemos no desenvolvimento de uma REST API para utilizar os dados do projeto Open Food Facts, que é um banco de dados aberto com informação nutricional de diversos produtos alimentícios.

O projeto tem como objetivo dar suporte a equipe de nutricionistas da empresa Fitness Foods LC para que eles possam revisar de maneira rápida a informação nutricional dos alimentos que os usuários publicam pela aplicação móvel.

Antes de começar

  • Prepare o projeto para ser disponibilizado no Github, copiando o conteúdo deste repositório para o seu (ou utilize o fork do projeto e aponte para o Github). Confirme que a visibilidade do projeto é pública (não esqueça de colocar no readme a referência a este challenge);
  • O projeto deve utilizar a Linguagem específica na sua Vaga (caso esteja se candidatando). Por exempo: Python, R, Scala e entre outras;
  • Considere como deadline 5 dias a partir do início do desafio. Caso tenha sido convidado a realizar o teste e não seja possível concluir dentro deste período, avise a pessoa que o convidou para receber instruções sobre o que fazer.
  • Documentar todo o processo de investigação para o desenvolvimento da atividade (README.md no seu repositório); os resultados destas tarefas são tão importantes do que o seu processo de pensamento e decisões à medida que as completa, por isso tente documentar e apresentar os seus hipóteses e decisões na medida do possível.

O projeto

  • Criar um banco de dados MongoDB usando Atlas: https://www.mongodb.com/cloud/atlas ou algum Banco de Dados SQL se não sentir confortável com NoSQL;
  • Criar uma REST API com as melhores práticas de desenvolvimento, Design Patterns, SOLID e DDD.
  • Integrar a API com o banco de dados criado para persistir os dados
  • Recomendável usar Drivers oficiais para integração com o DB
  • Desenvolver Testes Unitários

Modelo de Dados:

Para a definição do modelo, consultar o arquivo products.json que foi exportado do Open Food Facts, um detalhe importante é que temos dois campos personalizados para poder fazer o controle interno do sistema e que deverão ser aplicados em todos os alimentos no momento da importação, os campos são:

  • imported_t: campo do tipo Date com a dia e hora que foi importado;
  • status: campo do tipo Enum com os possíveis valores draft, trash e published;

Sistema do CRON

Para prosseguir com o desafio, precisaremos criar na API um sistema de atualização que vai importar os dados para a Base de Dados com a versão mais recente do Open Food Facts uma vez ao día. Adicionar aos arquivos de configuração o melhor horário para executar a importação.

A lista de arquivos do Open Food, pode ser encontrada em:

Onde cada linha representa um arquivo que está disponível em https://challenges.coode.sh/food/data/json/{filename}.

É recomendável utilizar uma Collection secundária para controlar os históricos das importações e facilitar a validação durante a execução.

Ter em conta que:

  • Todos os produtos deverão ter os campos personalizados imported_t e status.
  • Limitar a importação a somente 100 produtos de cada arquivo.

A REST API

Na REST API teremos um CRUD com os seguintes endpoints:

  • GET /: Detalhes da API, se conexão leitura e escritura com a base de dados está OK, horário da última vez que o CRON foi executado, tempo online e uso de memória.
  • PUT /products/:code: Será responsável por receber atualizações do Projeto Web
  • DELETE /products/:code: Mudar o status do produto para trash
  • GET /products/:code: Obter a informação somente de um produto da base de dados
  • GET /products: Listar todos os produtos da base de dados, adicionar sistema de paginação para não sobrecarregar o REQUEST.

Extras

  • Diferencial 1 Configuração de um endpoint de busca com Elastic Search ou similares;
  • Diferencial 2 Configurar Docker no Projeto para facilitar o Deploy da equipe de DevOps;
  • Diferencial 3 Configurar um sistema de alerta se tem algum falho durante o Sync dos produtos;
  • Diferencial 4 Descrever a documentação da API utilizando o conceito de Open API 3.0;
  • Diferencial 5 Escrever Unit Tests para os endpoints GET e PUT do CRUD;
  • Diferencial 6 Escrever um esquema de segurança utilizando API KEY nos endpoints. Ref: https://learning.postman.com/docs/sending-requests/authorization/#api-key

Readme do Repositório

  • Deve conter o título do projeto
  • Uma descrição sobre o projeto em frase
  • Deve conter uma lista com linguagem, framework e/ou tecnologias usadas
  • Como instalar e usar o projeto (instruções)
  • Não esqueça o .gitignore
  • Se está usando github pessoal, referencie que é um challenge by coodesh:

This is a challenge by Coodesh

Finalização e Instruções para a Apresentação

Avisar sobre a finalização e enviar para correção.

  1. Confira se você respondeu o Scorecard anexado na Vaga que se candidatou;
  2. Confira se você respondeu o Mapeamento anexado na Vaga que se candidatou;
  3. Acesse https://coodesh.com/challenges/review;
  4. Adicione o repositório com a sua solução;
  5. Grave um vídeo, utilizando o botão na tela de solicitar revisão da Coodesh, com no máximo 5 minutos, com a apresentação do seu projeto. Utilize o tempo para:
  • Explicar o objetivo do desafio
  • Quais tecnologias foram utilizadas
  • Mostrar a aplicação em funcionamento
  • Foque em pontos obrigatórios e diferenciais quando for apresentar.
  1. Adicione o link da apresentação do seu projeto no README.md.
  2. Verifique se o Readme está bom e faça o commit final em seu repositório;
  3. Confira a vaga desejada;
  4. Envie e aguarde as instruções para seguir no processo. Sucesso e boa sorte. =)

Suporte

Use a nossa comunidade para tirar dúvidas sobre o processo