Skip to content

Fred-Reis/get-recipes

Repository files navigation

Get Recipes

Get Recipes API

language version GitHub language count GitHub top language GitHub repo size in bytes


Links:

                       

💡 Sobre esse desafio:

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"
}

📑 Requisitos

  • 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 .envpara armazenar informações sensíveis, como a chave da API do Giphy

📐 Arquitetura:

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

🔥 Funcionalidades:

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"
	  }
	]
}

🧪 Testes:

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.

🛠 Tecnologias e Ferramentas:

Algumas das tecnologias e ferramentas utilizadas nesse projeto.

🏁 Executando o 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

🐳 Configurando o Docker

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.

🖼 Criando Imagem

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

📦 Criando um container

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 a 5432 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á a 3333 que foi a porta declarada no nosso arquivo Dockerfile, 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!.

"Stay hungry stay foolish!"



Author: Frederico Reis

Feito com ♥️

About

🚀 A back-end api to get recipes

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published