A proposta do desafio era construir uma API que recebesse ingredientes como parâmetros de entrada em uma chamada GET e retornasse uma lista de receitas, cada receita deveria seguir o seguinte formato:
{
"title": "Titulo da receita",
"ingredients": ["ingrediente_1", "ingrediente_2", "..."],
"link": "O link para a receita",
"gif": "Um gif relacionado a essa receita"
}
- Utilização da API pública da RecipePuppy, para obter a lista de receitas;
- Utilização da API pública da Giphy, para gerar os Gifs;
- Para obter o gif no Giphy, deveria ser utilizado o título de cada receita;
- Os ingredientes recebidos pelo RecipePuppy são recebidos em String, e deveriam ser organizados em um array ordenado por ordem alfabética;
- Era necessário informar ao usuário caso algum dos serviçoes externos estivem indisponíveis;
- Fazer o Deploy do projeto no Docker;
- A API deveria receber como parâmetro um conjunto de no máximo 3 ingredientes;
- Foi criado um arquivo
.env
para armazenar informações sensíveis, como a chave da API do Giphy
O projeto foi concebido utilizando a metodologia de DDD - Domain Driven Design, seguindo os princípios do SOLID e Design Patterns. Separando responsabilidades, diminuindo acoplamentos, facilitando na refatoração e estimulando o reaproveitamento do código.
Estrutura:
src
├── __tests__
| └── App.spec.ts
├── modules
| └── recipes
| ├── dtos
| | └── ICreateRecipeDTO.ts
| ├── infra
| | ├── entities
| | | └── Recipe.ts
| | ├── http
| | | ├── controllers
| | | | └── RecipesController.ts
| | | └── routes
| | | └── recipe.routes.ts
| | └── repositories
| | └── RecipesRepository.ts
| ├── repositories
| | └── IRecipesRepository.ts
| └── services
| ├── CreateGifsService.ts
| ├── CreateRecipeService.ts
| └── ImportRecipesService.ts
└── shared
├── errors
| └── AppError.ts
└── infra
└── http
├── routes
| └── index.ts
└── server.ts
A API possui apenas um endpoint, que deve respeitar a seguinte chamada:
http://{HOST}/recipes/?i={ingredient_1},{ingredient_2}
Exemplo:
http://localhost:5432/recipes/?i=garlic,eggs
A resposta de requisição deveria ter como estrutura: um array com as palavras chaves (ingredientes da chamada) organizados em ordem alfabética e uma lista de receitas:
{
"keywords": ["egg", "garlic"],
"recipes": [
{
"title": "Roast Garlic Fresh Pasta Recipe",
"ingredients": ["garlic", "egg yolks", "eggs", "pasta", "flour"],
"link": "http://www.grouprecipes.com/33194/roast-garlic-fresh-pasta.html",
"gif": "https://media.giphy.com/media/xBRhcST67lI2c/giphy.gif"
},{
"title": "Maria's Stuffed Chicken Breasts",
"ingredients": ["chicken", "eggs", "garlic", "salt"],
"link":"http://allrecipes.com/Recipe/Marias-Stuffed-Chicken-Breasts/Detail.aspx",
"gif":"https://media.giphy.com/media/I3eVhMpz8hns4/giphy.gif"
}
]
}
Foram implementados testes unitários utilizando Jest;
Para executar os testes basta executar o seguinte comando na raiz do projeto:
$ npm test
Os detalhes do teste serão apresentados no seu console.
Também será gerado automáticamente na raiz do seu projeto uma pasta chamada coverage
, dentro dela terá uma outra pasta chamada Lcov-report
. Dentro dessa pasta terá um arquivo index.html
abra ele no seu browser e tenha acesso a mais detalhes dos testes executados.
Algumas das tecnologias e ferramentas utilizadas nesse projeto.
1 - Para rodar pela primeira vez o seu projeto será necessário a criação de uma pasta.
$ mkdir <nome-da-pasta>
2 - Agora entre na pasta criada.
$ cd <nome-da-pasta>
3 - Vamos clonar o repositório
$ git clone https://github.com/Fred-Reis/delivery-much_tech-test
4 - Execute o comando a seguir para a criação da pasta node_modules
$ npm install
5 - Para iniciar o servidor em modo desenvolvimento execute o seguinte comando
$ npm dev:server
Recomendo o uso do Insomnia para testar as chamadas ao servidor
O projeto possui um arquivo chamado Dockerfile
que possui as configurações para o deploy do projeto em um container do Docker, ele é quem irá passar todos parâmetros que o Docker utilizará para criar nossa imagem.
Vamos partir da premissa que você já tem o docker instalado e pronto para receber a criação de uma imagem, caso ainda não tenha recomendo seguir esse GUIA.
Agora com o Docker devidamente instalado vamos começar criando a imagem do nosso projeto dentro do Docker usando o comando docker build
.
O comando a seguir recebe uma flag -t
que ira permitir que você crie um nome para a sua imagem:
❗️Importante: É necessário que você esteja dentro da raiz do seu projeto para executar o comando abaixo, pois ele irá utilizar o "." para informar que o contexto da build é o diretório atual. E não esqueça o ponto!
$ docker build -t nome_usuário/delivery-much-image .
A primeira vez irá demorar um pouco pois o Docker irá baixar a imagem do NodeJs também.
Com o comando a seguir é possível ver a sua imagem que foi criada:
$ docker images
Com nossa imagem já criada vamos criar um container usando o comando docker run
vamos usar aqui algumas flags para nos ajudar:
-p
Vai fazer o direcionamento das portas, a primeira será a porta que você irá utilizar para acessar pelo seu navegador, aconselho a5432
que é a porta padrão utilizada pelo Docker, mas fique a vontade para escolher a porta que for melhor pra você, mas lembresse dela pois será a porta que você irá acessar o container no Docker. A segunda porta OBRIGATORIAMENTE será a3333
que foi a porta declarada no nosso arquivoDockerfile
, e será a porta que o Docker irá ouvir da sua máquina.-d
Isso executa o container em segundo plano.--name
Permite dar um nome ao nosso container.
$ docker run --name <nome-container> -p 5432:3333 -d <nome-da-nossa-imagem>
Se tudo deu certo até aqui execute o comando a seguir e você verá o seu container.
$ docker ps -a
Agora dê o start no seu container com o comando:
$ docker start <id do container>
E com o comando abaixo você decerá ver o seu container executando
$ docker ps
Caso isso não aconteça execute o comando abaixo e veja o que aconteceu de errado com a execução do seu container
$ docker logs <id do container>
Será mostrado os logs que foram gerados.
Se você chegou até aqui é sinal que tudo deu certo e você agora já pode fazer a sua chamada direto do seu browser 😱 seguindo o exemplo abaixo.
http://localhost:5432/recipes/?i=garlic,eggs
😃 Agora busque as suas receitas e ... SEJA FELIZ!.
Author: Frederico Reis
Feito com