Este projeto foi completamente desenvolvido em TypeScript, utilizando Node.js, Express, Cors, Mongoose, MongoDB e outras bibliotecas auxiliares como Joi, jsonwebtoken, bcrypt e Docker. 🚀
Esta API foi desenvolvida seguindo o paradigma de programação orientada a objetos, aderindo aos princípios do SOLID e seguindo uma arquitetura composta por uma camada adicional, conhecida como Domain, que foi previamente definida antes do início do desenvolvimento do projeto, para assegurar a manutenção e respeito a esses princípios.
Na arquitetura das camadas, possui uma camada Controller
responsável por tratar possíveis erros e validações antes de encaminhar as requisições para a camada de Service. Além disso, a camada de Service
é onde se encontram a maior parte das regras de negócio e onde é possível acessar o repositório ou ODM (Object-Document Mapping) que possui as funções para interagir com o banco de dados MongoDB, utilizando a biblioteca Mongoose.
Neste projeto, optou-se por não utilizar o padrão de projeto Repository, sendo substituído por uma camada chamada Model
, que difere um pouco das models tradicionais. Foram utilizados ODMs, onde cada uma delas, além de ser uma extensão de uma classe abstrata AbstractODM, também é responsável apenas por criar um schema do MongoDB. Os métodos genéricos para realizar operações de CRUD básico estão efetivamente implementados na classe abstrata AbstractODM.
Além disso, o projeto também conta com outras camadas, como Rotas
para definir as rotas da API, Config
para configurar a conexão com o banco de dados, Middlewares
tratar interceptações de requisições e respostas, Interfaces
para definir as interfaces utilizadas no projeto, Validations
com os schemas de validação do Joi para garantir a integridade dos dados, e Utils
com algumas funções auxiliares para facilitar o desenvolvimento do projeto.
Estrutura do projeto
O projeto é composto de 3 entidades importantes para sua estrutura:
1️⃣ Banco de dados:
- Será um container docker MongoDB já configurado no docker-compose através de um serviço definido como
mongodb
. - Tem o papel de fornecer dados para o serviço de backend.
2️⃣ Back-end:
- Deve rodar na porta
3030
, - A aplicação é inicializada a partir do arquivo
src/server.ts
;
3️⃣ Docker:
- O
docker-compose
tem a responsabilidade de unir todos os serviços conteinerizados (backend e db) e subir a API completa com o comandodocker-compose up -d
; - Você deve verificar se a porta
3030
está disponivel.
👀 Leia essa parte atentamente, pois aqui você encontrará informações importantes para rodar corretamente o projeto.
🔰 Pré-requisitos
- 📦 Node.js (v14 ou superior)
- 🐳 Docker e Docker Compose instalados na máquina
🔰 Configuração
- Clone o repositório
Usar link SSH
git clone https://github.com/Gabrielja2/projeto-mjv.git
- Entre na pasta do repositório que você acabou de clonar:
cd pasta-do-repositório
- Instale as dependências [Caso existam]
npm install
- Configure as variáveis de ambiente se necessário:
- Preencha as variáveis de, como a URL do banco de dados MongoDB: MONGO_URL=
mongodb://localhost:27017/mjv-projec
e a porta do servidor node: PORT =3000
- Inicie os containers do Docker:
docker-compose up -d
- Dentro do terminal da imagem do node, inicie o servidor em modo de desenvolvimento:
npm run start-dev
São as rotas para logar ou registrar um novo usuário
Rota de Login
- Método: POST
- URL: /user/login
- Descrição: Realiza o login de um usuário cadastrado.
- Parâmetros de entrada:
- email: String (obrigatório) - E-mail do usuário.
- password: String (obrigatório) - Senha do usuário.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo o token de autenticação do usuário.
Rota de Registro
- Método: POST
- URL: /user/register
- Descrição: Registra um novo usuário.
- Parâmetros de entrada:
- username: String (obrigatório) - Nome do usuário.
- email: String (obrigatório) - E-mail do usuário.
- password: String (obrigatório) - Senha do usuário.
- Resposta de sucesso:
- Código: 201
- Corpo: Objeto contendo o token de autenticação do usuário.
As rotas a seguir exigem autenticação utilizando o token gerado no processo de login ou registro.
Rota listar usuários
- Método: GET
- URL: /user
- Descrição: Retorna as informações dos usuários.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo as informações dos usuários.
Rota de detalhes de um usuário
- Método: GET
- URL: /user/:id
- Descrição: Retorna os detalhes de um usuário específico pelo seu ID.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo as informações do usuário.
Rota de atualização do usuário
- Método: PUT
- URL: /user/:id
- Descrição: Atualiza as informações do usuário autenticado.
- Parâmetros de entrada:
- username: String (opcional) - Novo nome do usuário.
- email: String (opcional) - Novo e-mail do usuário.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo as informações atualizadas do usuário.
Rota de exclusão do usuário
- Método: DELETE
- URL: /user/:id
- Descrição: Exclui um usuário.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo uma mensagem de confirmação da exclusão.
Rota de Registro de Suco
- Método: POST
- URL: /juice
- Descrição: Registra um novo suco na loja de sucos. Requer autenticação de um usuário.
- Parâmetros de entrada:
- flavor: String (obrigatório) - Sabor do suco.
- description: String (obrigatório) - Descrição do suco.
- price: Number (obrigatório) - Preço do suco.
- size: String (obrigatório) - Tamanho do copo de suco.
- Resposta de sucesso:
- Código: 201
- Corpo: Objeto contendo as informações do suco registrado.
Rota de Listagem de Sucos
- Método: GET
- URL: /juice
- Descrição: Retorna a lista de sucos cadastrados na loja de sucos.
- Resposta de sucesso:
- Código: 200
- Corpo: Array contendo os objetos dos sucos cadastrados.
Rota de Detalhes de Sucos
- Método: GET
- URL: /juice/:id
- Descrição: Retorna os detalhes de um suco específico pelo seu ID.
- Parâmetros de entrada:
- id: String (obrigatório) - ID do suco.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo as informações do suco específico.
Rota de Atualização de Suco
- Método: PUT
- URL: /juice/:id
- Descrição: Atualiza as informações de um suco específico pelo seu ID. Requer autenticação de um usuário com a função de vendedor.
- Parâmetros de entrada:
- id: String (obrigatório) - ID do suco.
- flavor: String (opcional) - Novo sabor do suco.
- description: String (opcional) - Nova descrição do suco.
- price: Number (opcional) - Novo preço do suco.
- size: String (opcional) - Novo tamanho do copo de suco.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo as informações atualizadas do suco específico.
Rota de Exclusão de Suco
- Método: DELETE
- URL: /juice/:id
- Descrição: Exclui um suco específico pelo seu ID. Requer autenticação de um usuário com a função de vendedor.
- Parâmetros de entrada:
- id: String (obrigatório) - ID do suco.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo uma mensagem de confirmação da exclusão.
Rota de Criação de Pedido
- Método: POST
- URL: /order
- Descrição: Cria um novo pedido na loja de sucos. Requer autenticação de um usuário com a função de cliente.
- Parâmetros de entrada:
- quantity: Number (obrigatório) - Quantidade do suco a ser adicionado ao pedido.
- flavor: String (obrigatório) - Sabor do suco a ser adicionado ao pedido.
- size: String (obrigatório) - Tamanho do copo de suco a ser adicionado ao pedido.
- Resposta de sucesso:
- Código: 201
- Corpo: Objeto contendo as informações do pedido criado.
Rota de Listagem de Pedidos
- Método: GET
- URL: /order
- Descrição: Retorna a lista de pedidos cadastrados na loja de sucos de um usuário específico. Requer autenticação de um usuário com a função de cliente.
- Resposta de sucesso:
- Código: 200
- Corpo: Array contendo os objetos dos pedidos cadastrados pelo usuário.
Rota de Detalhes de Pedido
- Método: GET
- URL: /order/:id
- Descrição: Retorna os detalhes de um pedido específico pelo seu ID. Requer autenticação de um usuário com a função de cliente.
- Parâmetros de entrada:
- id: String (obrigatório) - ID do pedido.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo as informações do pedido específico.
Rota de Atualização de Pedido
- Método: PUT
- URL: /order/:id
- Descrição: Atualiza as informações de um pedido específico pelo seu ID. Requer autenticação de um usuário com a função de cliente.
- Parâmetros de entrada:
- id: String (obrigatório) - ID do pedido.
- quantity: Number (opcional) - Nova quantidade de suco.
- flavor: String (opcional) - Novo sabor do suco.
- size: String (opcional) - Novo tamanho do copo de suco.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo as informações atualizadas do pedido específico.
Rota de Exclusão de Pedido
- Método: DELETE
- URL: /order/:id
- Descrição: Exclui um pedido específico pelo seu ID. Requer autenticação de um usuário com a função de cliente.
- Parâmetros de entrada:
- id: String (obrigatório) - ID do pedido.
- Resposta de sucesso:
- Código: 200
- Corpo: Objeto contendo uma mensagem de confirmação da exclusão.