Food Explorer API é uma aplicação que simula um cardápio de um restaurante fictício, conta com front-end e back-end desenvolvidos com tecnologias aprendidas na trilha Explorer da Rocketseat.
O projeto conta com front-end e back-end desenvolvidos com tecnologias aprendidas na trilha Explorer da Rocketseat. A aplicação pode ser utilizada através de um login com e-mail e senha, que deve ser registrado previamente, e conta com dois tipos de usuário, usuário comum e administrador.
Você pode testar a aplicação completa através desse link ou, escaneando o QR Code abaixo:
Para logar na aplicação e testar suas fucionalidades, utilize um dos logins já existentes listados abaixo:
Tipo | Senha | |
---|---|---|
USER | user@email.com | 123456 |
ADMIN | admin@email.com | 123456 |
- Nodejs
- JavaScript
- Express
- Sqlite
- Knex
- Multe
- PM2
Deploy: Render
Testes de requisições: Insomnia
Confira também o front-end dessa aplicação disponibilizado no repositório FoodExplorer front-end
A aplicação conta com dois tipos de persona, usuário comum e usuário administrador. Abaixo veremos a listagem das funcionalidades da aplicação de acordo com o tipo de usuário juntamente com uma terceira listagem contendo funcionalidades disponiveis em ambos perfis. Para funcionalidades disponíveis para ambos os tipos de usuários, o recurso devolvido através do response pode ser diferente.
USER/ADMIN:
- Iniciar seção
- Listar pratos
- Buscar pratos
- Visualizar prato
USER:
- Adicionar pra aos favoritos
- Listar favoritos
- Adicionar pratos ao carrinho
- Criar pedido
- Listar e visualizar pedidos do usuário
ADMIN:
- Criar novo prato
- Editar e/ou remover pratos
- Listar, visualizar e atualizar pedidos
- Atualizar usuário (sem interface gráfica no front-end)
Para rodar o projeto localmente será necessário primeiro clonar o projeto, selecione um local ou pasta de sua escolha para armazenar o projeto e acesse o caminho via terminal.
Após selecionar o caminho de sua escolha, execute o comando abaixo:
git clone https://github.com/araujodai/food_explorer_back-end
Acesse o diretório do projeto:
cd food_explorer_back-end
Instale as dependências:
npm install
Inicie o servidor:
npm run dev
Você pode utilizar a aplicação completa através desse link.
Essa aplicação também pode ser testada localmente em conjunto com o front-end desse projeto, basta seguir a documentação do FoodExplorer front-end clicando aqui.
Para rodar o projeto localmente podemos utilizar o Insomnia para realizar nossas requisições, basta clicar aqui para baixar.
-
Depois de instalado, crie uma Collection clicando em CREATE -> REQUEST COLLECTION e atribua um nome.
-
Com a Collection criada, clique em New HTTP Request.
-
Selecionar o Método HTTP: Escolha o método HTTP adequado (GET, POST, PUT, DELETE, etc.) para sua requisição.
-
Configurar a URL: Insira a URL do endpoint ao qual você deseja fazer a requisição (
localhost:3333/resource
) -
Adicionar o Corpo da Requisição: Clique na aba "Body" para adicionar o corpo da requisição (se houver) e selecione o tipo do corpo, somente usaremos JSON ou Multipart Form.
- Para JSON:
{ "chave": "valor", "outroCampo": "outroValor" }
- Para Multipart Form:
Adicione os campos necessários clicando em "Add". Para cada campo, preencha:
Key Type Value name text Nome Exemplo image file [Selecionar imagem]
- Para JSON:
-
Enviar a Requisição: Clique em "Send" para enviar a requisição e visualizar a resposta na aba "Preview".
Todas as funcionalidades contam com o método HTTP a ser utilizado no título da funcionalidade (GET, POST, PUT, DELETE, etc), o endpoint contendo o recurso e/ou parâmetros será descrito dentro dos detalhes da funcionalidade, algumas funcionalidades podem passar por melhorias ou foram incluídas visando alguma melhoria, sempre que finalizada essa documentação será atualizada.
Como montar a requisição com essa documentação:
Method | Base URL | Resource | Parameter |
---|---|---|---|
título (METHOD) | localhost:3333 |
/resource |
/:id |
Permite a um usuário se registrar na aplicação, somente usuários cadastrados podem utilizar a aplicação.
Endpoint: localhost:3333/users
Corpo da requisição:
{
"name": "Nome do usuário exemplo",
"email": "exemplo@email.com",
"password": "123456"
}
Por padrão, o usuário criado é do tipo comum, para criar usuários com permissões de administrador, basta adicionar o campo "is_admin" como sendo verdadeiro.
{
"is_admin": 1
}
Essa funcionalidade não possui nenhum conteúdo de resposta, somente a confirmação na aba preview.
Inicia sessão dando acesso a área logada da aplicação. Após iniciada a seção recemos os dados do usuário registrado.
Endpoint: localhost:3333/sessions
Corpo da requisição:
{
"email": "exemplo@email.com",
"password": "123456"
}
Exemplo de resposta esperada:
{
"user": {
"id": 2,
"name": "Nome do usuário exemplo",
"email": "exemplo@email.com",
"password": "fsdf1dsf415sd4f0s5df4s64f6s",
"is_admin": 0
},
"token": "edls5d6fdf6df5d6f5d6f59.edsfsdfdsE3MjI2MsdfsdfsdfiMiJ9.JsdfVpdfAq36S-xfdsfsdfdsf"
}
Tip
O conteúdo do campo "token" pode ser usado na aba "Bearer" do Insomnia para validar as requisições realizadas nas funcionalidades seguintes, copie o conteúdo e cole no campo "TOKEN", caso tenha importado o modelo de Collection do Insomnia disponibilizado anteriormente, ignore esse esse trecho.
Atualiza os dados de um usuário logado, essa funcionalidade não conta com interface gráfica no front-end dessa aplicação, somente está disponível no back-end para melhorias futuras.
Endpoint: localhost:3333/users
Corpo da requisição:
{
"name": "user",
"email": "user@email.com",
"password": "654321",
"old_password": "123456",
"is_admin" : 0
}
O campo "is_admin" somente pode ser modificado por usuários administradores
Este recurso permite gerenciar os pratos disponíveis na aplicação. Adicione /menu
ao final da URL para acessar
diversas funcionalidades, como criar, listar, exibir, editar e excluir pratos.
-
Cria um novo prato para ser disponibilizado no menu da aplicação, disponível somente para usuários administradores. Para criar um novo prato precisaremos passar nome, categoria, descrição, preço, ingredientes e a foto do prato no corpo da requisição.
Endpoint:
localhost:3333/menu
Corpo da requisição:
-
Para JSON (sem imagem):
{ "name": "Prato exemplo 2", "description": "Descrição exemplo do prato", "price": 9.99, "category": "drinks", "ingredients": "[\"exemplo1\", \"exemplo2\", \"exemplo3\"]" }
É possível editar o prato futuramente, sendo assim adicionar uma imagem no momento do cadastro nao é obrigatório.
-
Para Multipart Form (com imagem):
Key Type Value name Text Nome Exemplo description Text Descrição Exemplo price Text 19.99 category Text Categoria Exemplo ingredients Text ["ingrediente1", "ingrediente2"] image File [Selecionar imagem]
Para cadastrar novos pratos utilize uma das categorias disponíveis:
categories = [ { label: "Entradas", value: "entrances" }, { label: "Refeições", value: "meals" }, { label: "Sobremesas", value: "desserts" }, { label: "Bebidas", value: "drinks" }, { label: "Porções", value: "portions" }, ];
-
-
Exibe todos os pratos cadastrados, utilize para obter o ID de um prato específico se necessário. Essa funcionalidade está disponível para ambos tipos de usuário.
Endpoint:
localhost:3333/menu
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Exemplo de resposta esperada:
[ { "id": 3, "name": "Prato exemplo 2", "description": "Descrição exemplo do prato", "price": 9.99, "category": "drinks", "image": null, "created_at": "2024-08-02 21:24:16", "updated_at": "2024-08-02 21:24:16" }, { "id": 4, "name": "Prato exemplo", "description": "Descrição exemplo do prato", "price": 9.99, "category": "drinks", "image": "60297f1f8b8f7633dc38-espresso.png", "created_at": "2024-08-02 21:28:48", "updated_at": "2024-08-02 21:28:48" } ]
-
Exibe todos os detalhes de um prato específico, disponível para ambos tipos de usuários. Para exibir um prato cadastrado iremos utilizar a URL abaixo substituindo
/:menu_item_id
pelo ID do prato.Endpoint
localhost:3333/menu/:menu_item_id
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Exemplo de resposta esperada:
{ "id": 4, "name": "Prato exemplo", "description": "Descrição exemplo do prato", "price": 9.99, "category": "drinks", "image": "60297f1f8b8f7633dc38-espresso.png", "created_at": "2024-08-02 21:28:48", "updated_at": "2024-08-02 21:28:48", "ingredients": [ { "id": 4, "menu_item_id": 4, "name": "ingrediente1" }, { "id": 5, "menu_item_id": 4, "name": "ingrediente2" } ] }
-
Atualiza as informações de um prato cadastrado anteriormente, somente usuários administradores tem acesso a essa funcionalidade. Para atualizar um prato será necessário utilizar a URL abaixo substituindo
/:menu_item_id
pelo ID do prato, passaremos as informações no corpo da requisição conforme feito na criação do prato.Endpoint
localhost:3333/menu/:menu_item_id
Corpo da requisição:
-
Para JSON (sem imagem):
{ "name": "Prato Exemplo atualizado", "description": "Descrição exemplo atualizada", "price": 29.99, "category": "entrances", "ingredients": ["update1", "update2", "update3"] }
-
Para Multipart Form (somente com imagem):
Key Type Value image File [Selecionar imagem]
-
-
Remove um prato do menu permanentemente, disponível somente para usuários administradores. Substitua o
/:menu_item_id
passado como parâmtro na URL abaixo pelo ID do prato a ser removido.Endpoint:
localhost:3333/menu/:menu_item_id
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Essa funcionalidade não possui nenhum conteúdo de resposta, somente a confirmação na aba preview.
Este recurso permite gerenciar os pedidos criados na aplicação. Adicione /orders
ao final da URL para acessar
as funcionalidades criar, listar, exibir e editar pedidos.
-
Cria um pedido vinculado ao usuário logado, essa funcionalidade está disponível somente para usuários comuns. Para utilizar sem interface gráfica será necessário passar no corpo da requisição um array contendo o ID do prato juntamente com a quantidade para cada item, o método de pagamento e o total do pedido.
Endpoint:
localhost:3333/orders
Corpo da requisição:
{ "cart_items": [ { "id": 3, "quantity": 1 }, { "id": 4, "quantity": 1 } ], "amount": 19.98, "payment_method": "pix" }
No momento essa funcionalidade recebe o total do pedido no corpo da requisição pois não é calculada no back-end, serão feitas melhorias em breve, removendo essa responsabilidade do front-end.
Exemplo de resposta esperada:
{ "order_id": 2 }
-
Se o usuário logado for do tipo comum, exibe todos os pedidos vinculados a esse usuário, se for do tipo administrador, todos os pedidos da plataforma serão exibidos.
Endpoint:
localhost:3333/orders
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Exemplo de resposta esperada:
[ { "id": 2, "user_id": 2, "total_price": 19.98, "created_at": "2024-08-02 22:22:56", "payment_method": "pix", "status": "pending", "items": [ { "menu_item_id": 3, "quantity": 1, "menu_item_name": "Prato exemplo 2" }, { "menu_item_id": 4, "quantity": 1, "menu_item_name": "Prato exemplo" } ] } ]
-
Exibe os detalhes de um pedido específico, disponível para ambos tipos de usuários. Substitua o
/:order_id
passado como parâmtro na URL abaixo pelo ID do pedido a ser visualizado.Endpoint:
localhost:3333/orders/:order_id
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Exemplo de resposta esperada:
{ "id": 2, "user_id": 2, "total_price": 19.98, "created_at": "2024-08-02 22:22:56", "payment_method": "pix", "status": "pending", "order_items": [ { "id": 3, "quantity": 1, "name": "Prato exemplo 2", "price": 9.99, "image": null }, { "id": 4, "quantity": 1, "name": "Prato exemplo", "price": 9.99, "image": "60297f1f8b8f7633dc38-espresso.png" } ] }
-
Atualiza o status de um pedido existente, essa funcionalida está disponível somente para usuários administradores. Substitua o
/:order_id
passado como parâmtro na URL abaixo pelo ID do pedido a ser atualizado. No corpo da requisição deve ser enviado o status novo a ser atribuído ao pedido.Endpoint:
localhost:3333/orders/:order_id
Corpo da requisição:
{ "status": "approved" }
Este recurso permite gerenciar os pratos favoritos do usuário, sendo assim é um recurso restrito a usuários comuns. Adicione /favorites
ao final da URL para acessar
as funcionalidades adicionar, listar e remover.
-
Adiciona um item do menu aos favoritos do usuário logado. Substitua o
/menu_item_id
passado como parâmetro na URL abaixo pelo ID do prato a ser adicionado aos favoritos.Endpoint:
localhost:3333/favorites/:menu_item_id
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Essa funcionalidade somente retorna o ID do favorito na aba preview.
-
Exibe todos os pratos favoritos do usuário logado.
Endpoint:
localhost:3333/favorites
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Exemplo de resposta esperada:
[ { "id": 1, "menu_item_id": 4, "menu_item_name": "Prato exemplo", "menu_item_image": "60297f1f8b8f7633dc38-espresso.png" } ]
-
Remove um prato específico dos favoritos do usuário. Substitua o
/menu_item_id
passado como parâmetro na URL abaixo pelo ID do prato a ser removido dos favoritos.Endpoint:
localhost:3333/favorites/:menu_item_id
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Essa funcionalidade não possui nenhum conteúdo de resposta, somente a confirmação na aba preview.
Para visualizar a imagem de um prato específico é possível utilizar o endpoint abaixo, como parâmetro passamos o nome da imagem registrada no prato, o nome da imagem pode ser obtido através da listagem de pratos.
Endpoint: localhost:3333/files/nome_da_imagem_do_prato.png
Corpo da requisição:
Não é necessário enviar nenhum conteúdo no corpo da requisição. Apenas a URL e os parâmetros de consulta (se houver) são utilizados.
Ao executar receberemos a imagem atribuída ao prato na aba preview.
Projeto criado por Rocketseat e desenvolvido por Daiane Araújo.