Essa API foi criada para o desafio final do curso Explorer da Rocketseat
As seguintes ferramentas foram usadas na construção do projeto:
Esse site é o resultado de 1 ano de muito estudo e dedicação! depois de quase 1 anos de curso da Rocketseat, realizei esse desafio final! Tive que desenvolver um site e-commerce de um restaurante, onde o usuário administrativo pode criar, editar e excluir qualquer prato, além de criar categorias para cada prato especifico , e o usuário comum pode, favoritar qualquer prato, buscar pelo nome da comida ou pelo ingrediente, e adicionar quantos itens desejar no carrinho!
Para conseguir rodar o projeto na sua máquina é necessário ter o GIT e o NODE.JS instalado (verifique a versão de ambos e, se for preciso, atualize para a ultima versão)
Primeiro passo é clonar o código para sua máquina, podemos fazer isso utilizando o git clone, basta clicar no botão "code" e escolher a forma que deseja clonar, https ou ssh
Com o link copiado, abra seu terminal na pasta que deseja colocar o projeto e execute git clone
git clone https://github.com/gabriel-vitebo/api-food-explorer.git
Depois de termina de clonar, no seu editor de código, vc já deve conseguir visualizar a pasta com os conteúdos dentro
Agora, com o projeto já clonado, vamos instalar todas as dependências que o projeto precisa para rodar, primeiro, verifique se você está dentro da pasta do projeto,se executar o npm install fora da pasta, não irá funcionar, agora vamos utilizar o npm install
npm install
Depois de instalar todas as dependências, irá aparecer uma pasta chamada "node_modules"
Agora precisamos criar o banco de dados antes de testar a API, para isso, podemos executar:
npm run migrate
Esse comando vai rodas todas as migrates, criar todas as tabelas do banco de dados, nesse projeto vamos utilizar o SQLite com o knex
Depois de executar o comando, dentro da pasta database vai ter um arquivo chamado database.db
Se você já tiver dado o comando "npm run dev" para rodar o projeto,as migrates não vao ser criadas, para gerar as migrates, basta fecha o servidor ou abri uma janela nova no terminal e executar o comando
Para visualizar as tabelas do banco de dados,vamos precisar usar um SGBD (Sistema Gerenciador de Banco de Dados)
Eu vou utilizar o Beekeeper Studio, porém, fique livre para utilizar o que achar melhor
Depois de instalar o Beekeeper, vamos nos conectar ao banco de dados
-
Connection Type ou Tipo de conexão: Selecione a opção "SQLite"
-
Database File: Clique em "Choose File" ou "Escolher arquivo",entre na pasta onde você clonou o repositório e vá até a pasta "src", depois entre na pasta "database" do projeto, e selecione o arquivo "database.db"
-
Agora é so clicar em "connect" ou "conectar" e pronto, estamos conectados com o banco de dados
Agora podemos visualizar todas as tabelas presentes no banco de dados e ja podemos testar a API
agora podemos rodar o projeto utilizando
npm run dev
No seu terminal deverá exibir a mensagem
server is running on Port 3333
Isso significa que o projeto está rodando com sucesso na sua máquina
Caso queira importa todo ambiente configurado, bastar importar do link abaixo
Para testar os métodos da API eu utilizo uma ferramenta chamada Insomnia, porém existe outras ferramentas para testar os métodos HTTP, fique livre para utilizar o que for melhor para você
Se for preciso, vou deixar abaixo algumas dicas que você pode fazer no insomnia para deixar o projeto mais organizado
- Crie um ambiente, nesse ambiente você pode deixar alguns valores padrão, como a base url, que nesse projeto vai ser
``` localhost:3333 ```
- Crie pastas para cada um dos controles, e dentro dessas pastas, você consegue organizar por todos os métodos que esse controle utiliza
- Dentro de cada pasta, você consegue criar um ambiente para aquela pasta, assim, é mais pratico porque não precisa digitar o endereço sempre que for usa, basta usar a variável
- Dentro do ambiente base, você pode deixar salvo como padrão também, o token de autentificação, é muito mais produtivo, caso contrario, você tera que definir o token de autentificação em cada rota usar e precisar do token
- Abaixo está as informações para configurar o token
No controle de usuário, temos apenas o endpoint de criar, usamos apenas o método POST
para cadastrar o usuário, crie um arquivo HTTP request com o método POST com o endereço abaixo ,esse arquivo devera ser um JSON com um objeto contendo as informações em ray
localhost:3333/users
{
"name": "string",
"email": "[email protected]",
"password": "string",
"isAdm": true false,
}
IMPORTANTE
- password deverá ter 6 caracteres ou mais, caso contrario, ocorrerá um erro
- Se o "isAdm" for "false" você não vai conseguir criar, atualizar e nem deletar os pratos nessa conta,porque só os ADM tem acesso a isso
- Usuário administrativo só é possível ser criado aqui pelo backend
No controle de sessions, temos apenas o endpoint de criar, usamos apenas o método POST
Agora para autentificar o usuário, vamos acessar o endereço
localhost:3333/sessions
no insomnia, vamos criar outro arquivo HTTP request chamada 'sessions' batendo no endereço acima,o arquivo deve conter um JSON com um objeto que contem as informações do usuário em ray
{
"email": "[email protected]",
"password": "string"
}
A resposta será as informações do usuário e o token de acesso
No controle de categorias, temos 5 endpoint
Create, Delete, Index, Show, GetAll
Para usar qualquer método de category, é preciso está autenticado, por isso, vá em "auth" e escolha a opção de "Bearer" e no valor, coloque o valor do token
o valor do token você pode visualizar na sessions, quando você da um POST, a resposta retorna algumas informações sobre o usuário, entre elas, o token. A desvantagem de usar o token assim, é que, quando o token espirar e mudar, você vai precisar mudar o valor manualmente, por isso, recomendo o jeito abaixo (A maneira que mencionei abaixo é usado no insomnia, eu não sei como fazer em outra ferramenta)
Outro jeito de pegar o valor do token é naquele ambiente base que mencionei lá em cima, para usar, é só colocar o nome da variável no valor, nesse caso, quando o token expirar e criar um novo,a variável atualiza sozinho
caso você não tenha a variável, você consegue criar na hora, em value basta digitar 'body attribute' e clicar na função que irá aparecer, e fazer as configurações que deixei lá em cima
IMPORTANTE
Em qualquer lugar da aplicação que o usuário precisar ser autentificado, o processo é o mesmo
Com o usuário já autenticado, vamos seguir!
Para criar uma categoria nova, vamos acessar o endereço
localhost:3333/categories
Vamos criar outro arquivo HTTPS request com o nome de 'create', utilizando o método POST, recebendo um JSON com objeto contendo a informação em ray
{
"name":"string"
}
Vamos criar outro arquivo HTTPS request com o nome de 'index', utilizando o método GET, Aqui vamos acessar apenas /categories
http://localhost:3333/categories
A resposta vai ser, um objeto contendo todas a informação dos pratos relacionados a cada categoria cadastrada
Vamos criar um arquivo HTTPS request com o nome de 'show', utilizando o método GET, Aqui vamos passar o ID da categoria no parâmetro
localhost:3333/categories/:id
A resposta vai ser todos os pratos cadastrados relacionando a essa categoria especifica
Vamos criar um arquivo HTTPS request com o nome de 'getAll', utilizando o método GET, e vamos apenas colocar /all no parâmetro
localhost:3333/categories/all
A resposta deve ser a informação de todas as categorias cadastradas
Vamos criar um arquivo HTTPS request com o nome de 'Delete', utilizando o método DELETE, e vamos apenas colocar o id da categoria que deseja deletar no parâmetro
localhost:3333/categories/:id
No controle de foods, temos 5 endpoint
Create, showDetails, Delete, index, update
IMPORTANTEPara fazer qualquer requisição no controle de foods, é necessário está autentificado
Para criar um prato novo, vamos acessar o endereço
localhost:3333/foods
Vamos criar outro arquivo HTTPS request com o nome de 'create', utilizando o método POST, recebendo um JSON com objeto contendo as informações em multiPart
name: string,
description: string,
price: number,
image: file,
ingredients: ["string1", "string2"],
categoryId: string
IMPORTANTE
A imagem deve ser colocada em um arquivo file, se colocar o nome da imagem em uma string não irá funcionar, no insomnia, no lugar de JSON, podemos colocar "Multipart", colocando todos os campos com os devidos valores, e em imagem selecionar "file" e por esse input escolher a imagem que deseja enviar (no Multipart não é necessário colocar "" nos valores igual em JSON, caso coloque "" em categoryId vai dar null)
- Todos os campos são obrigatórios
- categoryId é so conferir na tabela de categorias pela categoria que deseja e pegar o id
- No preço não poder utilizar virgula ",", deverá ser apenas por ponto "."
- os ingredientes deve colocado dentro de um array(no Multipart o valor dentro do array precisa usar "", ["exemplo1", "exemplo2"])
Vamos criar outro arquivo HTTPS request com o nome de 'showDetails', utilizando o método GET, e vamos colocar o ID do prato como parâmetro
localhost:3333/foods/:id
A resposta vai ser as informações do prato buscado
Vamos criar outro arquivo HTTPS request com o nome de 'Delete', utilizando o método DELETE, e vamos colocar o ID do prato como parâmetro
localhost:3333/foods/:id
Depois, pode conferir no banco de dados para garantir que deu tudo certo, e o prato foi excluído
Vamos criar outro arquivo HTTPS request com o nome de 'index', utilizando o método GET, e vamos utilizar a query usando "name" com o "value" que deseja buscar
http://localhost:3333/foods?name=sushi
A resposta vai ser a informação de todos os pratos e ingredientes que dão match com o nome pesquisado, caso não houver, retornará um array vazio
Vamos criar outro arquivo HTTPS request com o nome de 'Update', utilizando o método PUT, e vamos colocar o ID do prato como parâmetro
localhost:3333/foods/:id
Aqui podemos utilizar do mesmo jeito que fizemos no Create, usando o Multiform,mudando os devidos valores que deseja atualizar, e na imagem colocando no arquivo file
name: string,
description: string,
price: number,
image: file,
ingredients: ["string1", "string2"],
categoryId: string
IMPORTANTE
Todos os campos deverá ser preenchido, mesmo que queira mudar apenas um campo, verifique se os outros campos estão preenchidos também
No controle de favoritos, temos 3 endpoint
adding, Delete, Show
IMPORTANTEPara fazer qualquer requisição no controle de favoritos, é necessário está autentificado
Vamos criar outro arquivo HTTPS request com o nome de 'adding', utilizando o método POST, e no corpo da requisição, em ray, passando o ID do prato que deseja favoritar
localhost:3333/favorites
{
"food_id": "string"
}
Vamos criar outro arquivo HTTPS request com o nome de 'Delete', utilizando o método DELETE, e nos parâmetros coloque o ID do prato que deseja remover dos favoritos
localhost:3333/favorites/:id
Vamos criar outro arquivo HTTPS request com o nome de 'Show', utilizando o método GET
localhost:3333/favorites
A resposta vai ser os pratos favoritados do usuário que solicitou, não precisamos passar o ID do usuário em nenhum lugar porque conseguimos identificar o usuário pelo token de autentificação utilizado
No controle de ingredients, temos 1 endpoint
index
IMPORTANTEPara fazer qualquer requisição no controle de ingredients, é necessário está autentificado
Vamos criar outro arquivo HTTPS request com o nome de 'index', utilizando o método GET, e basta da um request em
localhost:3333/ingredients
A resposta vai ser todos os ingredientes cadastrados no banco de dados
Esse projeto está sob a licença MIT.
Gabriel Vitebo ✅
Feito com ❤️ por Gabriel Vitebo 👋🏽 Entre em contato!