O Car Shop é uma API para gerenciar uma concessionária de veículos.
Nesse projeto, foram aplicados os princípios de POO para a construção de uma API Rest para gerenciar uma concessionária e veículos utilizando o banco de dados MongoDB através do ODM Mongoose.
👥 Na aplicação o usuário é capaz de:
-
Cadastrar um novo carro
-
Listar todos os carros
-
Listar um carro pelo seu ID
-
Atualizar um carro existente
-
Deletar um carro existente
-
Cadastrar uma nova moto
-
Listar todas as motos
-
Listar uma moto pelo seu ID
-
Atualizar uma moto existente
-
Deletar uma moto existente
🛠️ Habilidades utilizadas no desenvolvimento
- Práticas da arquitetura MSC
- Modelagem de dados com MongoDB através do ODM Mongoose;
- Construção de uma API REST com TypeScript e NodeJs;
- Práticas dos conhecimentos sobre os princípios SOLID;
- Práticas dos pilares de POO (Programação Orientada a Objetos): Herança, Abstração, Encapsulamento e Polimorfismo;
- Exercitar a Abstração para gerar projetos escaláveis e menos verbosos;
- Manuseio de containers com Docker;
- Práticas de utilização do framework Express;
- Teste unitários utilizando Chai e Sinon;
📝 Stacks praticadas durante o desenvolvimento
- Node.js
- TypeScript
- Express.js
- Docker
- MongoDB
- Mongoose ODM
- Sinon stubs
- Chai testing library
🐳 Execução da aplicação
- Para iniciar o projeto basta ter o docker instalado
- Crie um aquivo
.env
e cole o códigoMONGO_DB_URL=mongodb://localhost:27017/CarShop
. - Execute o comando
docker-compose up -d
na pasta raiz do repositório. - Para finalizar o projeto rode o comando
docker-compose down
na pasta raiz do repositório. - Para visualizar os logs do backend no terminal, rode o comando
docker-compose run logs app-car-shop
na pasta raiz do repositório. - A aplicação roda na porta
3001
- Exemplo de rota final:
http://localhost:3001/cars
🔀 Rotas
POST /cars
-
Para realizar o cadastro de um novo carro, utilize o método
POST
em/cars
, o body da requisição deve conter o seguinte formato:{ "model": "Marea", "year": 2002, "color": "Black", "status": true, "buyValue": 15.990, "doorsQty": 4, "seatsQty": 5 }
-
O retorno será um status
200
e umjson
contendo o veículo cadastrado:{ "id": "6348513f34c397abcad040b2", "model": "Marea", "year": 2002, "color": "Black", "status": true, "buyValue": 15.990, "doorsQty": 4, "seatsQty": 5 }
POST /motorcycles
-
Para realizar o cadastro de uma nova moto, utilize o método
POST
em/motorcycles
, o body da requisição deve conter o seguinte formato:{ "model": "Honda Cb 600f Hornet", "year": 2005, "color": "Yellow", "status": true, "buyValue": 30.000, "category": "Street", "engineCapacity": 600 }
-
O retorno será um status
200
e umjson
contendo o veículo cadastrado:{ "id": "6348513f34c397abcad040b2", "model": "Honda Cb 600f Hornet", "year": 2005, "color": "Yellow", "status": true, "buyValue": 30.000, "category": "Street", "engineCapacity": 600 }
GET /cars
-
Utilizando o método GET em
/cars
, o retorno será um status200
e umjson
contendo os carros cadastrados:[ { "id": "634852326b35b59438fbea2f", "model": "Marea", "year": 2002, "color": "Black", "status": true, "buyValue": 15.99, "doorsQty": 4, "seatsQty": 5 }, { "id": "634852326b35b59438fbea31", "model": "Tempra", "year": 1995, "color": "Black", "buyValue": 39, "doorsQty": 2, "seatsQty": 5 } ]
GET /motorcycles
-
Utilizando o método GET em
/motorcycles
, o retorno será um status200
e umjson
contendo uma lista de todas as motos cadastradas:[ { "id": "634852326b35b59438fbea2f", "model": "Honda Cb 600f Hornet", "year": 2005, "color": "Yellow", "status": true, "buyValue": 30.000, "category": "Street", "engineCapacity": 600 }, { "id": "634852326b35b59438fbea31", "model": "Honda Cbr 1000rr", "year": 2011, "color": "Orange", "status": true, "buyValue": 59.900, "category": "Street", "engineCapacity": 1000 } ]
GET /cars/:id
-
Utilizando o método GET em
/cars/:id
é possível buscar um carro específico, basta enviar por parâmetro oid
do veículo. -
O
id
deve ser um valor válido de um veículo existente no banco de dados e seguir os padrões de id do MongoDB, como no exemplo abaixo:http://localhost:3001/cars/6348513f34c397abcad040b2
-
O retorno será um status
200
e umjson
contendo o veículo com o id informado:{ "id": "6348513f34c397abcad040b2", "model": "Marea", "year": 2002, "color": "Black", "status": true, "buyValue": 15.990, "doorsQty": 4, "seatsQty": 5 }
-
Caso o veículo não seja encontrado, será retornado o status
404
e umjson
contendo uma mensagem:{ "message": "Car not found" }
-
Caso um
id
inválido seja informado, será retornado o status422
e umjson
contendo uma mensagem:{ "message": "Invalid mongo id" }
GET /motorcycles/:id
-
Utilizando o método GET em
/motorcycles/:id
é possível buscar uma moto específica, basta enviar por parâmetro oid
do veículo. -
O
id
deve ser um valor válido de um veículo existente no banco de dados e seguir os padrões de id do MongoDB, como no exemplo abaixo:http://localhost:3001/motorcycles/634852326b35b59438fbea2f
-
O retorno será um status
200
e umjson
contendo o veículo com o id informado:{ "id": "634852326b35b59438fbea2f", "model": "Honda Cb 600f Hornet", "year": 2005, "color": "Yellow", "status": true, "buyValue": 30.000, "category": "Street", "engineCapacity": 600 }
-
Caso o veículo não seja encontrado, será retornado o status
404
e umjson
contendo uma mensagem:{ "message": "Motorcycle not found" }
-
Caso um
id
inválido seja informado, será retornado o status422
e umjson
contendo uma mensagem:{ "message": "Invalid mongo id" }
PUT /cars/:id
-
Utilizando o método PUT em
/cars/:id
é possível atualizar um carro específico, basta enviar por parâmetro oid
do veículo e obody
da requisição deve conter o seguinte formato:{ "model": "Marea", "year": 1992, "color": "Red", "status": true, "buyValue": 12.000, "doorsQty": 2, "seatsQty": 5 }
-
O
id
deve ser um valor válido de um veículo existente no banco de dados e seguir os padrões de id do MongoDB, como no exemplo abaixo:http://localhost:3001/cars/634852326b35b59438fbea2f
-
O retorno será um status
200
e umjson
contendo o veículo com o id informado:{ "id": "634852326b35b59438fbea2f", "model": "Marea", "year": 1992, "color": "Red", "status": true, "buyValue": 12.000, "doorsQty": 2, "seatsQty": 5 }
-
Caso o veículo não seja encontrado, será retornado o status
404
e umjson
contendo uma mensagem:{ "message": "Car not found" }
-
Caso um
id
inválido seja informado, será retornado o status422
e umjson
contendo uma mensagem:{ "message": "Invalid mongo id" }
PUT /motorcycles/:id
-
Utilizando o método PUT em
/motorcycles/:id
é possível atualizar uma moto específica, basta enviar por parâmetro oid
do veículo e obody
da requisição deve conter o seguinte formato:{ "model": "Honda Cb 600f Hornet", "year": 2014, "color": "Red", "status": true, "buyValue": 45.000, "category": "Street", "engineCapacity": 600 }
-
O
id
deve ser um valor válido de um veículo existente no banco de dados e seguir os padrões de id do MongoDB, como no exemplo abaixo:http://localhost:3001/motorcycles/634852326b35b59438fbea2f
-
O retorno será um status
200
e umjson
contendo o veículo com o id informado:{ "id": "634852326b35b59438fbea2f", "model": "Honda Cb 600f Hornet", "year": 2014, "color": "Red", "status": true, "buyValue": 45.000, "category": "Street", "engineCapacity": 600 }
-
Caso o veículo não seja encontrado, será retornado o status
404
e umjson
contendo uma mensagem:{ "message": "Motorcycle not found" }
-
Caso um
id
inválido seja informado, será retornado o status422
e umjson
contendo uma mensagem:{ "message": "Invalid mongo id" }
DELETE /cars/:id
-
Utilizando o método DELETE em
/cars/:id
é possível deletar um carro do banco de dados, basta enviar por parâmetro oid
do veículo: -
O
id
deve ser um valor válido de um veículo existente no banco de dados e seguir os padrões de id do MongoDB, como no exemplo abaixo:http://localhost:3001/cars/634852326b35b59438fbea2f
-
O retorno será um status
204
sembody
: -
Caso o veículo não seja encontrado, será retornado o status
404
e umjson
contendo uma mensagem:{ "message": "Car not found" }
-
Caso um
id
inválido seja informado, será retornado o status422
e umjson
contendo uma mensagem:{ "message": "Invalid mongo id" }
DELETE /motorcycles/:id
-
Utilizando o método DELETE em
/motorcycles/:id
é possível deletar uma moto do banco de dados, basta enviar por parâmetro oid
do veículo: -
O
id
deve ser um valor válido de um veículo existente no banco de dados e seguir os padrões de id do MongoDB, como no exemplo abaixo:http://localhost:3001/motorcycles/634852326b35b59438fbea2f
-
O retorno será um status
204
sembody
: -
Caso o veículo não seja encontrado, será retornado o status
404
e umjson
contendo uma mensagem:{ "message": "Motorcycle not found" }
-
Caso um
id
inválido seja informado, será retornado o status422
e umjson
contendo uma mensagem:{ "message": "Invalid mongo id" }