Esse projeto contém uma série de informações sobre o que eu aprendi aqui na Trybe ao longo do curso de desenvolvimento web da Trybe.
Para este projeto, você deverá aplicar os princípios de Programação Orientada a Objetos (POO
) para a construção de uma API com CRUD
para gerenciar uma concessionária de veículos. Isso será feito utilizando o banco de dados MongoDB
.
Esse projeto foi proposto pelo curso de desenvolvimento web da Trybe.
Esse projeto foi desenvolvido no bloco de back-end e foi possível treinar a linguagem TypeScript, POO, Mongoose.
Os commits foram feitos de acordo com os requisitos finalizados.
Todo o projeto foi feita na branch 'juliana-oliveira-project-car-shop', isso por conta da exigência do curso.
Precisa utilizar o comando $npm install, a fim de instalar as dependências do projeto.
Precisa ter na máquina o mongodb.
Rode os serviços
node
emongodb
com o comandodocker-compose up -d
.
- Lembre-se de parar o
mongo
se estiver usando localmente na porta padrão (27017
), ou adapte, caso queria fazer uso da aplicação em containers - Esses serviços irão inicializar um container chamado
car_shop
e outro chamadocar_shop_db
. - A partir daqui você pode rodar o container
car_shop
via CLI ou abri-lo no VS Code.
Use o comando
docker exec -it car_shop bash
.
- Ele te dará acesso ao terminal interativo do container criado pelo compose, que está rodando em segundo plano.
Instale as dependências [Caso existam] com
npm install
⚠ Atenção ⚠ Caso opte por utilizar o Docker, TODOS os comandos disponíveis no package.json
(npm start, npm test, npm run dev, ...) devem ser executados DENTRO do container, ou seja, no terminal que aparece após a execução do comando docker exec
citado acima.
⚠ Atenção ⚠ O git dentro do container não vem configurado com suas credenciais. Ou faça os commits fora do container, ou configure as suas credenciais do git dentro do container.
⚠ Atenção ⚠ Não rode o comando npm audit fix! Ele atualiza várias dependências do projeto, e essa atualização gera conflitos com o avaliador.
✨ Dica: A extensão Remote - Containers
(que estará na seção de extensões recomendadas do VS Code) é indicada para que você possa desenvolver sua aplicação no container Docker direto no VS Code, como você faz com seus arquivos locais.
import mongoose from 'mongoose';
const MONGO_DB_URL = 'mongodb://localhost:27017/CarShop';
const MONGO_DB_URL = 'mongodb://mongodb:27017/CarShop';
const connectToDatabase = (
mongoDatabaseURI = process.env.MONGO_URI
|| MONGO_DB_URL,
) => mongoose.connect(mongoDatabaseURI);
export default connectToDatabase;
- O arquivo
src/app.ts
contém o código necessário para subir o servidor:
import express from 'express';
const app = express();
export default app;
O teste acontece de cada desafio, através do comando $npm test.
Esse foi um projeto individual,que desenvolvido somente por Juliana Oliveira.
Foi usado Visual Studio Code, além do Trello que auxiliou na organização das tarefas.
Nenhum.
No trabalho do desenvolvimento de software a gente sempre tem prazos, muitas vezes os prazos são apertados.
Por outro lado, eu não quero criar algo que não entendo perfeitamente, como também fazer códigos rápidos pode levar a erros que podem demorar muito pra corrigir.
Por isso, usei e sempre uso o método Baby Steps, que é uma estratégia de abordar o desafio passo à passo, defensivamente.
Baby steps é um termo em inglês que quer dizer passos de bebê. Refere-se a fazer as coisas, quaisquer que sejam, devagar, com calma, passo a passo.
Crie a interface IModel
, que será usada para a conexão com o banco de dados. Ela deverá ter, pelo menos, as funções create()
, read()
, readOne()
, update()
e delete()
.
Por ser genérica, nossa interface deverá receber um tipo T
qualquer, e ela deve esperar, em cada função, as seguintes especificações:
create()
: deve receber um objeto do tipoT
e retornar uma Promise do tipoT
.read()
: deve retornar uma Promise contendo um array de objetos do tipoT
.readOne()
: deve receber uma string e retornar uma Promise do tipoT
ou nula.update()
: deve receber uma string e um objeto do tipoT
e retornar uma Promise do tipoT
ou nula.delete()
: deve receber uma string e retornar uma Promise do tipoT
ou nula.- O arquivo deve ficar no diretório
/src/interfaces/
e ter o nome deIModel.ts
. - A interface deve ser exportada com o nome de
IModel
e não deve ser exportada de forma padrão.
Será verificado se:
- Existe a interface
IModel
; - A interface
IModel
possui todas as funções solicitadas; - A interface
IModel
pode ser implementada com qualquer tipo; - A interface está no local correto, com o nome correto e com a forma de exportação correta;
Crie a interface IVehicle
, que será usada para criarmos nossos tipos de carro, moto e caminhão.
Ela deverá ter todos os atributos comuns de todos os veículos que listaremos aqui. São eles:
Atributo | Descrição |
---|---|
model |
Marca e/ou modelo do veículo. Deve ser uma string com, pelo menos, 3 caracteres |
year |
Ano de fabricação do veículo. Deve ser um valor inteiro positivo maior ou igual a 1900, porém menor ou igual a 2022 |
color |
Cor principal do veículo. Deve ser uma string com, pelo menos, 3 caracteres |
status |
Status que define se um veículo pode ou não ser comprado. Deve receber valores booleanos e deve ser opcional |
buyValue |
Valor de compra do veículo. Deve receber apenas números inteiros |
- O arquivo deve ficar no diretório
/src/interfaces/
e ter o nome deIVehicle.ts
. - A interface deve ser exportada com o nome de
IVehicle
e não deve ser exportada de forma padrão.
⚠️ Apenas os tipos dos atributos serão avaliados nesse requisito
Será verificado se:
- A interface
IVehicle
existe; - A interface possui os atributos solicitados;
- A interface está no local correto, com o nome correto e com a forma de exportação correta.
Crie a interface ICar
, de modo que ela possua todos os atributos da interface IVehicle
e, também, os atributos:
Atributo | Descrição |
---|---|
doorsQty |
Quantidade de portas de um carro. Deve ser um valor inteiro positivo maior ou igual a 2 e menor ou igual a 4 |
seatsQty |
Quantidade de assentos disponíveis no carro. Deve ser maior ou igual a 2 e menor ou igual a 7 |
- O arquivo deve ficar no diretório
/src/interfaces/
e ter o nome deICar.ts
. - A interface deve ser exportada com o nome de
ICar
e não deve ser exportada de forma padrão.
⚠️ Apenas os tipos dos atributos serão avaliados nesse requisito
Será verificado se:
- A interface
ICar
estende a interfaceIVehicle
; - É possível criar um objeto do tipo
ICar
; - A interface
ICar
possui as propriedadesdoorsQty
eseatsQty
; - A interface está com local, nome e forma de exportação correta.
Crie uma rota que receba uma requisição POST
para cadastrar um veículo do tipo carro.
Será verificado se:
- A rota retorna erro
400
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 semmodel
,year
,color
ebuyValue
; - A rota retorna erro
400
ao tentar criar um carro semdoorsQty
eseatsQty
; - Não é possível criar um carro se os atributos
model
,year
,color
,buyValue
,doorsQty
eseatsQty
estiverem com tipos errados; - É possível criar um carro se todos os parâmetros forem passados corretamente;
- Sua API deve responder com status http
201
e o seguinte body:
_id: "4edd40c86762e0fb12000003",
model: "Ferrari Maranello",
year: 1963,
color: "red",
buyValue: 3500000,
seatsQty: 2,
doorsQty: 2
Escreva testes que cubram, pelo menos, 15% da camada Model. Seus arquivos de teste deverão estar na pasta src/tests/unit/model
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
models
é maior ou igual a 15%.
Escreva testes que cubram, pelo menos, 15% da camada Service. Seus arquivos de teste deverão estar na pasta src/tests/unit/services
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
services
é maior ou igual a 15%.
Escreva testes que cubram, pelo menos, 15% da camada Controller. Seus arquivos de teste deverão estar na pasta src/tests/unit/controllers
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
controllers
é maior ou igual a 15%.
👣Requisito 08 - Crie uma rota para o endpoint /cars
onde seja possível listar todos os carros registrados
Crie uma rota que receba uma requisição GET
para receber todos os veículos do tipo carro registrados no banco de dados.
Será verificado se:
- É possível listar os carros com sucesso;
- Haverá retorno de uma lista vazia se não houver carros;
- Sua API responderá com status http
200
em caso de sucesso.
👣Requisito 09 - Crie uma rota para o endpoint /cars/id
onde seja possível listar um único carro através do seu id
Crie uma rota que receba uma requisição GET
para receber determinado veículo do tipo carro que possua o id
passado como parâmetro na rota.
Será verificado se:
- É possível listar um carro com sucesso através do id;
- Sua API responderá com status http
200
em caso de sucesso; - É disparado o erro
400
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;
Escreva testes que cubram, pelo menos, 30% da camada Model. Seus arquivos de teste deverão estar na pasta src/tests/unit/model
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
models
é maior ou igual a 30%.
Escreva testes que cubram, pelo menos, 30% da camada Service. Seus arquivos de teste deverão estar na pasta src/tests/unit/services
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
services
é maior ou igual a 30%.
Escreva testes que cubram, pelo menos, 30% da camada Controller. Seus arquivos de teste deverão estar na pasta src/tests/unit/controllers
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
controllers
é maior ou igual a 30%.
👣Requisito 13 - Crie uma rota para o endpoint /cars/id
, onde é possível atualizar o registro de um carro através do seu id
Crie uma rota que receba uma requisição PUT
para atualizar determinado veículo do tipo carro que possua o id
passado como parâmetro na rota.
Será verificado se:
- É disparado o erro
404
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 obody
esteja vazio; - Um carro é atualizado com sucesso;
- Sua API responderá com status http
200
e o seguinte body, em caso de sucesso:
_id: "4edd40c86762e0fb12000003",
model: "Fiat Uno",
year: 1963,
color: "blue",
buyValue: 3500,
seatsQty: 4,
doorsQty: 4
Escreva testes que cubram, pelo menos, 60% da camada Model. Seus arquivos de teste deverão estar na pasta src/tests/unit/model
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
models
é maior ou igual a 60%.
Escreva testes que cubram, pelo menos, 60% da camada Service. Seus arquivos de teste deverão estar na pasta src/tests/unit/services
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
services
é maior ou igual a 60%.
Escreva testes que cubram, pelo menos, 60% da camada Controller. Seus arquivos de teste deverão estar na pasta src/tests/unit/controllers
.
Será verificado se:
- A cobertura total das linhas dos arquivos na pasta
controllers
é maior ou igual a 60%.
Crie uma rota que receba uma requisição DELETE
para excluir determinado veículo do tipo carro que possua o id
passado como parâmetro na rota.
Será verificado se:
- É disparado o erro
404
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; - Um carro é removido com sucesso;
- Sua API deve responder com status http
204
sem body;