O projeto consiste em construir uma API com CRUD para gerenciar uma concessionária de veículos utilizando Node.Js com MongoDB e aplicando os princípios da Programação Orientada a Objetos(POO)
- Introdução
- Ferramentas utilizadas
- CRUD
- MongoDB
- Mongoose
- POO
- SOLID
- Aprendizados
- Testes unitários e tratamento de erros
- Instruções para utilizar a aplicação
- Documentação
- Histórico de Commits
Back End: Docker, MongoDB, NodeJS, Mongoose, Testes Unitários com Mocha.
CRUD é um acrônimo para Create, Read, Update and Delete. Em português Criar, Ler, Atualizar e Deletar registros, nesse projeto não trabalhamos direto com um banco de dados para fazer as operações, fiz as operações por meio dos endpoints e utilizei mongoose para fazer a comunicação com o banco de dados!
Segundo o Site oficial do MongoDB, o MongoDB é um banco de dados de documentos com a escalabilidade e flexibilidade que você deseja junto com a consulta e indexação que você precisa.
Segundo esse artigo do freecodecamp, o Mongoose é um biblioteca de Modelagem de Dados de Objeto (ou ODM, do inglês: Object Data Modeling) para MongoDB e Node.js.
POO, programação orientada a objetos, é um dos paradigmas da programação. Sendo o objeto a junção de diversos comportamentos e estados, esse conceito está suportado na ideia de classes, que nada mais é que um conjunto de objetos que tem características comuns. A classe define o comportamento do objeto e esse, por sua vez, é definido por métodos e atributos. Nesse projeto foi possível praticar POO e consolidar os conhecimentos nos seus quatro pilares: herança, polimorfismo, abstração e encapsulamento.
SOLID ou S.O.L.I.D é um acrônimo para 5 princípios diferentes, cada princípio foi utilizado nesse projeto e ajudou a criar um código mais limpo e organizado, podendo o código ser reaproveitado por estar componetizado e de fácil refatoração. Cada letra do SOLID tem o seguinte significado:
- S — Single Responsiblity Principle (Princípio da responsabilidade única)
- O — Open-Closed Principle (Princípio Aberto-Fechado)
- L — Liskov Substitution Principle (Princípio da substituição de Liskov)
- I — Interface Segregation Principle (Princípio da Segregação da Interface)
- D — Dependency Inversion Principle (Princípio da inversão da dependência)
Fui capaz de consolidar os conhecimentos em MongoDB, SOLID, POO e Node. Consegui criar uma API completa usando os pilares do POO, fazendo a abstração de todas as classes, definindo comportamentos claros para cada um dos métodos criado de acordo com o pilar do encapsulamento. Também foi possível fazer com que novas classes herdassem os comportamentos de outras e pudessem alterar esses comportamentos de acordo com o polimorfismo.
Aprendi a manipular o MongoDB com mongoose, uma ODM poderosíssima capaz de fazer requisições ao banco de dados, também exercitei a criação e utilização de interfaces, classes, instâncias e objetos, aplicando, mais uma vez, os pilares da POO.
Além de utilizar o mocha, chai e sinnon, também utilizei a biblioteca zod para fazer validações dos dados na camada de serviços, dessa forma eu garanto que qualquer dado que é recebido pela camada de controller será tratado na camada de serviços e, em caso de algum dado ou tipo inválido, o erro será lançado ali mesmo, sem precisar chamar a camada de models.
Também foi importante a utilização da biblioteca NYC para garantir a cobertura de testes em todo o arquivo, dessa forma, podemos manter um comportamento padrão de nossa aplicação e em caso de alguma alteração de código na nossa API os testes unitários irão dizer se tudo ainda funciona.
Atual cobertura de testes. Os arquivos são monitorados linha por linha.
Para utilizar a aplicação você precisará ter o Docker instalado.
Após clonar o repositório, você precisará usar o comando docker-compose up -d
para criar e iniciar o container e depois executar o terminal bash do container e instalar as dependências do projeto com o comando npm install
. O comando deverá ser feito via terminal no diretório em que está o arquivo docker-compose.yml.
Após o container subir você poderá fazer as requisições utilizando um cliente HTTP (insomnia, postman, httpie e etc);
Método | Funcionalidade | URL |
---|---|---|
POST |
Realiza o cadastro de um veiculo | http://localhost:3001/cars |
A estrutura do body da requisição deverá seguir o padrão abaixo:
{
model: "Ferrari Maranello",
year: 1963,
color: "red",
buyValue: 3500000,
seatsQty: 2,
doorsQty: 2
}
A resposta da requisição é a seguinte com status 201
{
_id: "4edd40c86762e0fb12000003",
model: "Ferrari Maranello",
year: 1963,
color: "red",
buyValue: 3500000,
seatsQty: 2,
doorsQty: 2
}
A requisição irá falhar nos seguintes casos:
- A rota retorna erro400
caso a requisição receba um objeto vazio; - A rota retorna erro
400
ao tentar criar um carro com quantidade de assentos inferior a 2;- A rota retorna erro
400
ao tentar criar um carro com quantidade de portas inferior a 2;- A rota retorna erro
400
ao tentar criar um carro sem `model`, `year`, `color` e `buyValue`;- A rota retorna erro
400
ao tentar criar um carro sem `doorsQty` e `seatsQty`;- Não é possível criar um carro se os atributos `model`, `year`, `color`, `buyValue`, `doorsQty` e `seatsQty` estiverem com tipos errados;
Método | Funcionalidade | URL |
---|---|---|
GET |
Retorna uma lista de carros cadastrados | http://localhost:3001/cars |
A resposta da requisição é a seguinte com status 200
[
{
_id: "4edd40c86762e0fb12000003",
model: "Ferrari Maranello",
year: 1963,
color: "red",
buyValue: 3500000,
seatsQty: 2,
doorsQty: 2
},
...
]
Método | Funcionalidade | URL |
---|---|---|
GET |
Retorna um carro atravéz do id | http://localhost:3001/cars/:id |
A resposta da requisição é a seguinte com status 200
{
_id: "4edd40c86762e0fb12000003",
model: "Ferrari Maranello",
year: 1963,
color: "red",
buyValue: 3500000,
seatsQty: 2,
doorsQty: 2
}
A requisição irá falhar nos seguintes casos:
- É disparado o erro400
Id must have 24 hexadecimal characters
caso o id possua menos que 24 caracteres; - É disparado o erro
404
Object not found caso o id possua 24 caracteres
, mas seja inválido; Método | Funcionalidade | URL |
---|---|---|
PUT |
Atualizar um carro atravéz do id | http://localhost:3001/cars/:id |
A resposta da requisição é a seguinte com status 200
{
_id: "4edd40c86762e0fb12000003",
model: "Fiat Uno",
year: 1963,
color: "blue",
buyValue: 3500,
seatsQty: 4,
doorsQty: 4
}
A requisição irá falhar nos seguintes casos:
- É disparado o erro404
Object not found caso o id possua 24 caracteres
, mas seja inválido; - É disparado o erro
400
Id must have 24 hexadecimal characters
caso o id possua menos que 24 caracteres; - É disparado o erro
400
caso o body
esteja vazio; Método | Funcionalidade | URL |
---|---|---|
DELETE |
Deletar um carro atravéz do id | http://localhost:3001/cars/:id |
- A resposta da requisição é 204 e sem body em caso de sucesso
A requisição irá falhar nos seguintes casos:
- É disparado o erro404
Object not found
caso o id possua 24 caracteres, mas seja inválido; - É disparado o erro
400
Id must have 24 hexadecimal characters
caso o id possua menos que 24 caracteres; Método | Funcionalidade | URL |
---|---|---|
POST |
Realiza o cadastro de uma moto | http://localhost:3001/motorcycles |
A estrutura do body da requisição deverá seguir o padrão abaixo:
{
model: "Honda CG Titan 125",
year: 1963,
color: "red",
buyValue: 3500,
category: "Street",
engineCapacity: 125
}
A resposta da requisição é a seguinte com status 201
{
_id: "4edd40c86762e0fb12000003",
model: "Honda CG Titan 125",
year: 1963,
color: "red",
buyValue: 3500,
category: "Street",
engineCapacity: 125
}
A requisição irá falhar nos seguintes casos:
- A rota retorna erro400
caso a requisição receba um objeto vazio;
- A rota retorna erro 400
ao tentar criar uma moto com `category` diferente de `Street`, `Custom` ou `Trail`; - A rota retorna erro
400
ao tentar criar uma moto com `category` diferente de string; - A rota retorna erro
400
ao tentar criar uma moto com `engineCapacity` menor ou igual a zero; - A rota retorna erro
400
ao tentar criar uma moto com `engineCapacity` maior que 2500; - A rota retorna erro
400
ao tentar criar um moto sem `model`, `year`, `color` e `buyValue`; - A rota retorna erro
400
ao tentar criar um moto sem `category` e `engineCapacity`; - Não é possível criar uma moto se os atributos `model`, `year`, `color`, `buyValue`, `category` e `engineCapacity` estiverem com tipos errados;
Método | Funcionalidade | URL |
---|---|---|
GET |
Retorna uma lista de motos cadastradas | http://localhost:3001/motorcycles |
A resposta da requisição é a seguinte com status 200
[
{
_id: "4edd40c86762e0fb12000003",
model: "Honda CG Titan 125",
year: 1963,
color: "red",
buyValue: 3500,
category: "Street",
engineCapacity: 125
},
...
]
Método | Funcionalidade | URL |
---|---|---|
GET |
Retorna uma moto atravéz do id | http://localhost:3001/motorcycles/:id |
A resposta da requisição é a seguinte com status 200
{
_id: "4edd40c86762e0fb12000003",
model: "Honda CG Titan 125",
year: 1963,
color: "red",
buyValue: 3500,
category: "Street",
engineCapacity: 125
}
A requisição irá falhar nos seguintes casos:
- É disparado o erro400
Id must have 24 hexadecimal characters
caso o id possua menos que 24 caracteres; - É disparado o erro
404
Object not found caso o id possua 24 caracteres
, mas seja inválido; Método | Funcionalidade | URL |
---|---|---|
PUT |
Atualizar um carro atravéz do id | http://localhost:3001/motorcycles/:id |
A resposta da requisição é a seguinte com status 200
{
_id: "4edd40c86762e0fb12000003",
model: "Fiat Uno",
year: 1963,
color: "blue",
buyValue: 3500,
seatsQty: 4,
doorsQty: 4
}
A requisição irá falhar nos seguintes casos:
- É disparado o erro404
Object not found caso o id possua 24 caracteres
, mas seja inválido; - É disparado o erro
400
Id must have 24 hexadecimal characters
caso o id possua menos que 24 caracteres; - É disparado o erro
400
caso o body
esteja vazio; Método | Funcionalidade | URL |
---|---|---|
DELETE |
Deletar um carro atravéz do id | http://localhost:3001/motorcycles/:id |
- A resposta da requisição é 204 e sem body em caso de sucesso
A requisição irá falhar nos seguintes casos:
- É disparado o erro404
Object not found
caso o id possua 24 caracteres, mas seja inválido; - É disparado o erro
400
Id must have 24 hexadecimal characters
caso o id possua menos que 24 caracteres; Você pode verificar todo o histório de commits para saber como a aplicação foi desenvolvida passo a passo, todos eles foram feitos com base no guia de Conventional Commits, mantendo uma organização e descrição objetiva do que foi feito a cada mudança!