Skip to content

JuanVictorDavila/CarShop

Repository files navigation

Boas-vindas ao repositório do projeto Car Shop!

Orientações

!! Antes de começar a desenvolver
  1. Clone o repositório
  • Use o comando: git clone [email protected]:JuanVictorDavila/CarShop.git.
  • Entre na pasta do repositório que você acabou de clonar:
  1. Instale as dependências
  • npm install
  1. Crie uma branch a partir da branch main
  • Verifique se você está na branch main

    • Exemplo: git branch
  • Se não estiver, mude para a branch main

    • Exemplo: git checkout main
  • Agora crie uma branch onde você vai submeter os commits do seu projeto

    • Você deve criar uma branch no seguinte formato: nome-de-usuario-nome-do-projeto
    • Exemplo: git checkout -b joaozinho-sd-0X-project-car-shop
  1. Adicione as mudanças ao stage do Git e faça um commit
  • Verifique que as mudanças ainda não estão no stage

    • Exemplo: git status (deve aparecer listada a pasta joaozinho em vermelho)
  • Adicione o novo arquivo ao stage do Git

    • Exemplo:
      • git add . (adicionando todas as mudanças - que estavam em vermelho - ao stage do Git)
      • git status (deve aparecer listado o arquivo joaozinho/README.md em verde)
  • Faça o commit inicial

    • Exemplo:
      • git commit -m 'iniciando o projeto x' (fazendo o primeiro commit)
      • git status (deve aparecer uma mensagem tipo nothing to commit )
  1. Adicione a sua branch com o novo commit ao repositório remoto
  • Usando o exemplo anterior: git push -u origin joaozinho-sd-0X-project-car-shop
  1. Crie um novo Pull Request (PR)
  • Vá até a página de Pull Requests do repositório no GitHub
  • Clique no botão verde "New pull request"
  • Clique na caixa de seleção "Compare" e escolha a sua branch com atenção
  • Coloque um título para a sua Pull Request
    • Exemplo: "Cria tela de busca"
  • Clique no botão verde "Create pull request"
  • Adicione uma descrição para o Pull Request e clique no botão verde "Create pull request"
  • Não se preocupe em preencher mais nada por enquanto!
  • Volte até a página de Pull Requests do repositório e confira que o seu Pull Request está criado
⌨️ Durante o desenvolvimento
  • Faça commits das alterações que você fizer no código regularmente.

  • Lembre-se de sempre após um (ou alguns) commits atualizar o repositório remoto.

  • Os comandos que você utilizará com mais frequência são:

    1. git status (para verificar o que está em vermelho - fora do stage - e o que está em verde - no stage)
    2. git add (para adicionar arquivos ao stage do Git)
    3. git commit (para criar um commit com os arquivos que estão no stage do Git)
    4. git push -u nome-da-branch (para enviar o commit para o repositório remoto na primeira vez que fizer o push de uma nova branch)
    5. git push (para enviar o commit para o repositório remoto após o passo anterior)
🤝 Depois de terminar o desenvolvimento (opcional)

Para sinalizar que o seu projeto está pronto para o "Code Review", faça o seguinte:

  • Vá até a página DO SEU Pull Request, adicione a label de "code-review" e marque JuanVictorDavila:

    • No menu à direita, clique no link "Labels" e escolha a label code-review;

    • No menu à direita, clique no link "Assignees" e escolha o seu usuário;

    • No menu à direita, clique no link "Reviewers" e digite JuanVictorDavila.

Caso tenha alguma dúvida, aqui tem um video explicativo.

🎛 Linter

Para fazer a análise estática do seu código neste projeto, vamos utilizar o linter ESLint. Assim o código estará alinhado com as boas práticas de desenvolvimento, sendo mais legível e de fácil manutenção!

  • Este projeto já vem com as dependências relacionadas ao linter configuradas no arquivo package.json
  • Para poder rodar o ESLint basta executar o comando npm install dentro do projeto e depois npm run lint.
  • Se a análise do ESLint encontrar problemas no seu código, eles serão mostrados no seu terminal.
  • Se não houver problema no seu código, nada será impresso no seu terminal.
  • Você pode também instalar o plugin do ESLint no VSCode. Para isso, bastar ir em extensions e baixar o plugin ESLint.
🛠 Testes

Para executar os testes localmente, digite no terminal o comando npm test.

👀De olho na dica: especialmente no início, quando a maioria dos testes está falhando, a saída após executar os testes é bastante poluída. Você pode desabilitar temporariamente um teste utilizando a função skip junto à função describe. Como o nome indica, a função a seguir "pula" um teste:

describe.skip('...', () => {})
🐳 Como subir o banco do MongoDB usando Docker

Caso não tenha o MongoDB instalado em sua máquina e deseje usar o Docker, é só seguir os passos a seguir:

  1. Baixe a imagem do MongoDB:
docker pull mongo
  1. Crie o contêiner do MongoDB:
docker run --name <nome-do-conteiner> -p 27017:27017 -d mongo
  1. Confira se o contêiner está rodando:
docker ps
🐳 Rodando no Docker vs Localmente

Docker

Rode os serviços node e mongodb com o comando docker-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 chamado car_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.

Localmente

Instale as dependências [Caso existam] com npm install

⚠ 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: Para rodar o projeto desta forma, obrigatoriamente você deve ter o node instalado em seu computador. ✨ Dica: O avaliador espera que a versão do node utilizada seja a 16.

👷 Estruturação do projeto

Estrutura das pastas dentro de src

⚠️Importante: é muito importante que a estrutura da imagem a seguir seja mantida para que os testes funcionem da maneira desejada.

Estrutura de arquivos

Arquivos de exemplo

Dentro da pasta src foram deixados alguns arquivos de exemplo sendo eles:

  • src/controllers/controller.example.ts
  • src/index.example.ts
  • src/server.example.ts

⚠️Importante: é muito importante que o arquivo server.example.ts seja renomeado para server.ts para que os testes funcionem. ⚠️**

⚠️Importante: Os testes do projeto DEVEM ser unitários ⚠️**

✅ Arquivos prontos para uso
  • O arquivo src/connection.ts possui o código necessário para realizar a conexão com o banco de dados:
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:
public startServer(PORT: string | number = 3001): void {
    connectToDatabase();
    this.app.listen(
      PORT,
      () => console.log(`Server running here 👉 http://localhost:${PORT}`),
    );
  }
🔥⚠️ Tenha atenção para os seguintes pontos: ⚠️🔥

➡️ A conexão do banco local contida no arquivo src/connection.ts deverá conter o seguinte parâmetro:

const MONGO_DB_URL = 'mongodb://localhost:27017/CarShop';
  • Para o avaliador funcionar altere a conexão do banco contida no arquivo src/connection.ts para:
const MONGO_DB_URL = 'mongodb://mongodb:27017/CarShop';

➡️ Lembre-se de não entregar o projeto com nenhum teste ignorado. Testes ignorados serão tratados como testes falhando!

➡️ Não apague, em hipótese alguma, qualquer teste ou arquivo deste repositório.

➡️ src/models, src/services, src/controllers, src/interfaces e seus respectivos arquivos criados durante a execução do projeto, devem seguir à risca os nomes informados no README.

➡️ Não altere ou instale novas dependências no arquivo packages.json, pois o mesmo está travado para essa avaliação.

Requisitos

01 - Crie a interface Model genérica

Crie a interface Model, 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 tipo Te retornar uma Promise do tipo T.
  • read(): deve retornar uma Promise contendo um array de objetos do tipo T.
  • readOne(): deve receber uma string e retornar uma Promise do tipo T ou nula.
  • update(): deve receber uma string e um objeto do tipo T e retornar uma Promise do tipo T ou nula.
  • delete(): deve receber uma string e retornar uma Promise do tipo T ou nula.
  • O arquivo deve ficar no diretório /src/interfaces/ e ter o nome de ModelInterface.ts.
  • A interface deve ser exportada com o nome de Model e não deve ser exportada de forma padrão.
Será verificado se:
  • Existe a interface Model;
  • A interface Model possui todas as funções solicitadas;
  • A interface Model pode ser implementada com qualquer tipo;
  • A interface está no local correto, com o nome correto e com a forma de exportação correta;

02 - Crie a interface Vehicle genérica

Crie a interface Vehicle, 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 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 de VehicleInterface.ts.
  • A interface deve ser exportada com o nome de Vehicle e não deve ser exportada de forma padrão.
Será verificado se:
  • A interface Vehicle 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.

03 - Crie a interface Car a partir da Interface Vehicle

Crie a interface Car, de modo que ela possua todos os atributos da interface Vehicle e, também, os atributos:

Atributo Descrição
doorsQty Quantidade de portas de um carro. Deve ser 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 de CarInterface.ts.
  • A interface deve ser exportada com o nome de Car e não deve ser exportada de forma padrão.
Será verificado se:
  • A interface Car estende a interface Vehicle;
  • É possível criar um objeto do tipo Car;
  • A interface Car possui as propriedades doorsQty e seatsQty;
  • A interface está com local, nome e forma de exportação correta.

04 - Crie uma rota para o endpoint /cars onde seja possível cadastrar um novo carro

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 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;
  • É 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

05 - Escreva testes para cobrir 15% da camada de Model

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%.

06 - Escreva testes para cobrir 15% da camada de Service

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%.

07 - Escreva testes para cobrir 15% da camada de Controller

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%.

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.

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;

10 - Escreva testes para cobrir 30% da camada de Model

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%.

11 - Escreva testes para cobrir 30% da camada de Service

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%.

12 - Escreva testes para cobrir 30% da camada de Controller

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%.

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 o body 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

14 - Escreva testes para cobrir 60% da camada de Model

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%.

15 - Escreva testes para cobrir 60% da camada de Service

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%.

16 - Escreva testes para cobrir 60% da camada de Controller

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%.

17 - Crie uma rota para o endpoint /cars/id para excluir os registros de um carro

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;

Requisitos Bônus

18 - Crie a interface Motorcycle a partir da Interface Vehicle

Crie a interface Motorcycle, de modo que ela possua todos os atributos da interface Vehicle e, também, os atributos:

Atributos Descrição
category Categoria da moto. Deve poder ser apenas Street, Custom ou Trail
engineCapacity A capacidade do motor. Deve ser um valor inteiro positivo menor ou igual a 2500
  • O arquivo deve ficar no diretório /src/interfaces/ e ter o nome de MotorcycleInterface.ts.
  • A interface deve ser exportada com o nome de Motorcycle e não deve ser exportada de forma padrão.
Será verificado se:
  • A interface Motorcycle estende a interface Vehicle;
  • É possível criar um objeto do tipo Motorcycle;
  • A interface Motorcycle possui as propriedades category e engineCapacity;
  • Não é possível criar um objeto do tipo Motorcycle com uma categoria errada;
  • A interface está com local, nome e forma de exportação correta.

19 - Crie uma rota para o endpoint /motorcycles onde seja possível cadastrar uma nova moto

Crie uma rota que receba uma requisição POST para cadastrar um veículo do tipo moto.

Será verificado se:
  • A rota retorna erro 400 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;
  • É possível criar uma moto se todos os parâmetros forem passados corretamente;
  • Sua API responderá com status http 201 e o seguinte body:
  _id: "4edd40c86762e0fb12000003",
  model: "Honda CG Titan 125",
  year: 1963,
  color: "red",
  buyValue: 3500,
  category: "Street",
  engineCapacity: 125

20 - Crie uma rota para o endpoint /motorcycles onde seja possível listar todas as motos registradas

Crie uma rota que receba uma requisição GET para receber todos os veículos do tipo moto registrados no banco de dados.

Será verificado se:
  • É possível listar as motos com sucesso;
  • Haverá retorno de uma lista vazia se não houver motos;
  • Sua API responderá com status http 200.

21 - Crie uma rota para o endpoint /motorcycles/id onde seja possível listar uma única moto através do seu id

Crie uma rota que receba uma requisição GET para receber determinado veículo do tipo moto que possua o id passado como parâmetro na rota.

Será verificado se:
  • É possível listar uma moto 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;

22 - Crie uma rota para o endpoint /motorcycles/id onde é possível atualizar o registro de uma moto através do seu id

Crie uma rota que receba uma requisição PUT para atualizar determinado veículo do tipo moto 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 o body esteja vazio;
  • Una moto é atualizada com sucesso;
  • Sua API responderá com status http 200 e o seguinte body, em caso de sucesso:
  _id: "4edd40c86762e0fb12000003",
  model: "Honda CG Titan 125",
  year: 1963,
  color: "black",
  buyValue: 3500,
  category: "Street",
  engineCapacity: 125

23 - Crie uma rota para o endpoint /motorcycles/id para excluir os registros de uma moto

Crie uma rota que receba uma requisição DELETE para excluir determinado veículo do tipo moto 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;
  • Uma moto é removida com sucesso;
  • Sua API responderá com status http 204 sem body, em caso de sucesso;

24 - Escreva testes para cobrir 90% da camada de Model

Escreva testes que cubram 90% da camada Model. Seus arquivos de teste deverão estar na pasta src/tests/unit/models.

Será verificado se:
  • A cobertura total das linhas dos arquivos na pasta models é igual a 90%.

25 - Escreva testes para cobrir 90% da camada de Service

Escreva testes que cubram 90% 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 é igual a 90%.

26 - Escreva testes para cobrir 90% da camada de Controller

Escreva testes que cubram 90% 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 é igual a 90%.

27 - Escreva testes para cobrir 100% da camada de Model

Escreva testes que cubram 100% da camada Model. Seus arquivos de teste deverão estar na pasta src/tests/unit/models.

28 - Escreva testes para cobrir 100% da camada de service

Escreva testes que cubram 100% da camada Service. Seus arquivos de teste deverão estar na pasta src/tests/unit/services.

29 - Escreva testes para cobrir 100% da camada de controller

Escreva testes que cubram 100% da camada Controller. Seus arquivos de teste deverão estar na pasta src/tests/unit/controllers.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •