Coder Social home page Coder Social logo

project-car-shop's Introduction

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

👨‍💻 O que deverá ser desenvolvido

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 através do framework do Mongoose.


‼ Antes de começar a desenvolver
  1. Clone o repositório
  • Use o comando: git clone [email protected]:FranciscoVieir/Project-car-shop.git.
  • Entre na pasta do repositório que você acabou de clonar:
    • cd project-car-shop
  1. Instale as dependências
  • npm install

👀 Dicas
  • O arquivo src/Models/Connection.ts possui o código necessário para realizar a conexão com o banco de dados:
import mongoose from 'mongoose';
import 'dotenv/config';

const MONGO_DB_URL = 'mongodb://localhost: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 começar a gerenciar os middlewares:
import express from 'express';

const app = express();

export default app;

⚠️ Atenção: é muito importante que o arquivo src/app.ts exporte uma instância do app express para que os testes funcionem.


Requisitos

Desafios

01 - Crie a rota /cars onde seja possível cadastrar um carro

  • O endpoint deve ser acessível através do caminho (/cars);

  • Os carros cadastrados devem ser salvos na collection cars do banco de dados;

  • Os nomes dos arquivos/classes/interfaces devem ser definidos em inglês e seguir a organização/padronização de diretórios e nomenclatura ensinadas na seção;

  • Os nomes das classes devem possuir os mesmos nomes dos arquivos; (ex: Pet.ts ---> export default class Pet { });

  • Os atributos necessários para criar um carro estão na tabela:

Atributos Descrição
id String contendo id do veículo
model String contendo modelo do veículo
year Number contendo ano de fabricação do veículo
color String contendo cor principal do veículo
status Booleano contendo status que define se um veículo pode ou não ser comprado (este atributo deve ser opcional e se não passado, deve ser false)
buyValue Number contendo valor de compra do veículo
doorsQty Number contendo quantidade de portas de um carro
seatsQty Number contendo quantidade de assentos de um carro
  • O corpo da requisição poderá seguir o formato abaixo:
{
  "model": "Marea",
  "year": 2002,
  "color": "Black",
  "status": true,
  "buyValue": 15.990,
  "doorsQty": 4,
  "seatsQty": 5
}
Os seguintes pontos serão avaliados
  • Será validado que existe uma interface de nome ICar que representa o contrato usado para cadastrar um carro;
  • Será validado que a interface contém os atributos especificados na tabela;
  • Será validado que existe uma classe de domínio com o nome Car que representa o objeto carro;
  • Será validado que a classe de domínio carro contém os atributos: doorsQty e seatsQty acessíveis apenas a própria classe;
  • Será validado que a classe de domínio carro contém os atributos restantes acessíveis a própria classe e suas subclasses;
  • Será validado que a instância da classe de domínio carro recebe como parâmetro um objeto do tipo ICar;
  • Será validado que é possível cadastrar um carro com sucesso;
    • Deve-se retornar um JSON com as seguintes chaves:
      {
        "id": "6348513f34c397abcad040b2",
        "model": "Marea",
        "year": 2002,
        "color": "Black",
        "status": true,
        "buyValue": 15.990,
        "doorsQty": 4,
        "seatsQty": 5
      }

⚠️ Atenção, para o requisito ser avaliado corretamente:

  • A instância de um objeto de domínio deve receber um objeto como parâmetro;
  • As exportações devem ser feitas no formato export default;

02 - Crie o endpoint para listar carros

  • O endpoint deve ser acessível através do caminho (/cars) e (/cars/:id);

  • Os carros listados devem vir da collection cars do banco de dados;

  • Através do caminho /cars/:id, apenas o carro com o id presente na URL deve ser retornado;

Os seguintes pontos serão avaliados
  • Será validado que é possível listar todos os carros;
    • Deve-se retornar um JSON com as seguintes chaves:
        [
          {
            "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
          }
        ]
  • Será validado que não é possível listar um carro que não existe;
    • Deve-se retornar o status 404 e um JSON com a seguinte mensagem:
        { "message": "Car not found" }
  • Será validado que não é possível listar um carro quando o formato do id esta inválido;
    • Deve-se retornar o status 422 e um JSON com a seguinte mensagem:
        { "message": "Invalid mongo id" }
  • Será validado que é possível listar um carro específico com sucesso;
    • Deve-se retornar um JSON com as seguintes chaves:
        {
          "id": "634852326b35b59438fbea2f",
          "model": "Marea",
          "year": 2002,
          "color": "Black",
          "status": true,
          "buyValue": 15.99,
          "doorsQty": 4,
          "seatsQty": 5
        }


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

  • Obrigatoriamente seus arquivos de teste devem ficar no diretório tests/unit;

  • Obrigatoriamente seus testes devem fazer stub do banco de dados;

  • Opcionalmente você pode parar o serviço do MongoDB em sua máquina e executar seus teste com o comando npm run test:mocha;

  • Só será contabilizada a cobertura, se seus testes não conterem erros.

Os seguintes pontos serão avaliados
  • Será validado que os testes escritos por você estão sendo executados sem erros;
  • Será validado que existe um mínimo de 3 funções na camada Services.
  • Será validado que a cobertura total das linhas dos arquivos da camada Services é maior ou igual a 30%;


04 - Crie a rota /cars/:id onde seja possível atualizar um carro por ID

  • O endpoint deve ser acessível através do caminho (/cars/:id);

  • Apenas o carro com o id presente na URL deve ser atualizado;

  • O corpo da requisição poderá seguir o formato abaixo:

{
  "model": "Marea",
  "year": 1992,
  "color": "Red",
  "status": true,
  "buyValue": 12.000,
  "doorsQty": 2,
  "seatsQty": 5
}
Os seguintes pontos serão avaliados
  • Será validado que não é possível alterar um carro que não existe;
    • Deve-se retornar o status 404 e um JSON com a seguinte mensagem:
        { "message": "Car not found" }
  • Será validado que não é possível alterar um carro quando o formato do id esta inválido;
    • Deve-se retornar o status 422 e um JSON com a seguinte mensagem:
        { "message": "Invalid mongo id" }
  • Será validado que é possível alterar um carro com sucesso;
    • Deve-se retornar um JSON com as seguintes chaves:
      {
        "id": "634852326b35b59438fbea2f",
        "model": "Marea",
        "year": 1992,
        "color": "Red",
        "status": true,
        "buyValue": 12.000,
        "doorsQty": 2,
        "seatsQty": 5
      }


05 - Crie a rota /motorcycles onde seja possível cadastrar uma moto

  • O endpoint deve ser acessível através do caminho (/motorcycles);

  • As motos cadastradas devem ser salvas na collection motorcycles do banco de dados;

  • Os nomes dos arquivos/classes/interfaces devem ser definidos em inglês e seguir a organização/padronização de diretórios e nomenclatura ensinadas na seção;

  • Os nomes das classes devem possuir os mesmos nomes dos arquivos; (ex: Pet.ts ---> export default class Pet { });

  • Interface e classe de domínio referentes a carro, obrigatoriamente devem ser refatorados;

  • Os atributos necessários para criar uma moto estão na tabela:

Atributos Descrição
id String contendo id do veículo
model String contendo modelo do veículo
year Number contendo ano de fabricação do veículo
color String contendo cor principal do veículo
status Booleano contendo status que define se um veículo pode ou não ser comprado (este atributo deve ser opcional e se não passado, deve ser false)
buyValue Number contendo valor de compra do veículo
category String contendo categoria da moto (opções: Street, Custom ou Trail)
engineCapacity Number contendo capacidade do motor
  • O corpo da requisição poderá seguir o formato abaixo:
{
  "model": "Honda Cb 600f Hornet",
  "year": 2005,
  "color": "Yellow",
  "status": true,
  "buyValue": 30.000,
  "category": "Street",
  "engineCapacity": 600
}
Os seguintes pontos serão avaliados
  • Será validado que existe uma interface de nome IMotorcycle que representa o contrato usado para cadastrar uma moto;
  • Será validado que a interface contém os atributos especificados na tabela;
  • Será validado que existe uma interface de nome IVehicle e esta contém os atributos repetidos de carro e moto;
    • Deve-se refatorar as Interfaces se necessário;
  • Será validado que existe uma classe de domínio com o nome Motorcycle que representa o objeto moto;
  • Será validado que a classe de domínio moto contém os atributos: category e engineCapacity acessíveis apenas a própria classe;
  • Será validado que a classe de domínio moto contém os atributos restantes acessíveis a própria classe e suas subclasses;
  • Será validado que a instância da classe de domínio moto recebe como parâmetro um objeto do tipo IMotorcycle;
  • Será validado que existe uma classe de domínio com o nome Vehicle e esta contém os atributos repetidos de carro e moto;
    • Deve-se refatorar as Domains se necessário;
  • Será validado que a classe de domínio veiculo contém os atributos acessíveis a própria classe e suas subclasses;
  • Será validado que existe uma classe de nome AbstractODM que representa o modelo de comunicação com o banco e ela serve como abstração para as demais;
    • Deve-se refatorar as Models se necessário;
  • Será validado que é possível cadastrar uma moto com sucesso;
    • Deve-se retornar um JSON com as seguintes chaves:
      {
        "id": "6348513f34c397abcad040b2",
        "model": "Honda Cb 600f Hornet",
        "year": 2005,
        "color": "Yellow",
        "status": true,
        "buyValue": 30.000,
        "category": "Street",
        "engineCapacity": 600
      }

⚠️ Atenção, para o requisito ser avaliado corretamente:

  • A instância de um objeto de domínio deve receber um objeto como parâmetro;
  • As exportações devem ser feitas no formato export default;
  • Arquivos/códigos feitos para cars devem podem sofrer refatorações;

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

  • Obrigatoriamente seus arquivos de teste devem ficar no diretório tests/unit;

  • Obrigatoriamente seus testes devem fazer stub do banco de dados;

  • Opcionalmente você pode parar o serviço do MongoDB em sua máquina e executar seus teste com o comando npm run test:mocha;

  • Só será contabilizada a cobertura, se seus testes não conterem erros.

Os seguintes pontos serão avaliados
  • Será validado que os testes escritos por você estão sendo executados sem erros;
  • Será validado que existe um mínimo de 5 funções na camada Services.
  • Será validado que a cobertura total das linhas dos arquivos da camada Services é maior ou igual a 60%;


07 - Crie a rota /motorcycles onde seja possível listar motos

  • O endpoint deve ser acessível através do caminho (/motorcycles) e (/motorcycles/:id);

  • As motos listadas devem vir da collection motorcycles do banco de dados;

  • Através do caminho /motorcycles/:id, apenas a moto com o id presente na URL deve ser retornada;

Os seguintes pontos serão avaliados
  • Será validado que é possível listar todas as motos;
    • Deve-se retornar um JSON com as seguintes chaves:
        [
          {
            "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
          }
        ]
  • Será validado que não é possível listar uma moto que não existe;
    • Deve-se retornar o status 404 e um JSON com a seguinte mensagem:
        { "message": "Motorcycle not found" }
  • Será validado que não é possível listar uma moto quando o formato do id esta inválido;
    • Deve-se retornar o status 422 e um JSON com a seguinte mensagem:
        { "message": "Invalid mongo id" }
  • Será validado que é possível listar uma moto específica com sucesso;
    • Deve-se retornar um JSON com as seguintes chaves:
        {
          "id": "634852326b35b59438fbea31",
          "model": "Honda Cbr 1000rr",
          "year": 2011,
          "color": "Orange",
          "status": true,
          "buyValue": 59.900,
          "category": "Street",
          "engineCapacity": 1000
        }


Requisitos Bônus

08 - Crie a rota /motorcycles/:id onde seja possível atualizar uma moto por ID

  • O endpoint deve ser acessível através do caminho (/motorcycles/:id);

  • Apenas a moto com o id presente na URL deve ser atualizada;

  • O corpo da requisição poderá seguir o formato abaixo:

{
  "model": "Honda Cb 600f Hornet",
  "year": 2014,
  "color": "Red",
  "status": true,
  "buyValue": 45.000,
  "category": "Street",
  "engineCapacity": 600
}
Os seguintes pontos serão avaliados
  • Será validado que não é possível alterar uma moto que não existe;
    • Deve-se retornar o status 404 e um JSON com a seguinte mensagem:
        { "message": "Motorcycle not found" }
  • Será validado que não é possível alterar uma moto quando o formato do id esta inválido;
    • Deve-se retornar o status 422 e um JSON com a seguinte mensagem:
        { "message": "Invalid mongo id" }
  • Será validado que é possível alterar uma moto com sucesso;
    • Deve-se retornar um JSON com as seguintes chaves:
      {
        "id": "634852326b35b59438fbea2f",
        "model": "Honda Cb 600f Hornet",
        "year": 2014,
        "color": "Red",
        "status": true,
        "buyValue": 45.000,
        "category": "Street",
        "engineCapacity": 600
      }


09 - Escreva testes para cobrir 80% da camada de Service

  • Obrigatoriamente seus arquivos de teste devem ficar no diretório tests/unit;

  • Obrigatoriamente seus testes devem fazer stub do banco de dados;

  • Opcionalmente você pode parar o serviço do MongoDB em sua máquina e executar seus teste com o comando npm run test:mocha;

  • Só será contabilizada a cobertura, se seus testes não conterem erros.

Os seguintes pontos serão avaliados
  • Será validado que os testes escritos por você estão sendo executados sem erros;
  • Será validado que existe um mínimo de 8 funções na camada Services.
  • Será validado que a cobertura total das linhas dos arquivos da camada Services é maior ou igual a 80%;

project-car-shop's People

Contributors

franciscovieir avatar trybe-tech-ops avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.