/car_shop

Uma API REST criada com CRUD, TypeScript, mongoDB e ODM mongoose para gerenciar uma concessionária de veículos

Primary LanguageTypeScript

Car Shop


Bem-vindo ao Car shop projeto de API de gerenciamento de concessionária de veículos com CRUD utilizando Programação Orientada a Objetos (POO) e banco de dados MongoDB com o framework do Mongoose.

Este projeto foi desenvolvido com o objetivo de aplicar os princípios da POO na construção de uma API para gerenciamento de uma concessionária de veículos. A API permitirá a realização das operações de CRUD (Create, Read, Update, Delete) para manipulação dos dados de veículos cadastrados.

A construção da API será realizada utilizando o banco de dados MongoDB com o framework do Mongoose, o que proporcionará uma fácil manipulação dos dados através de uma interface amigável e intuitiva.


Rotas

A API possui as seguintes rotas:

Antes de cada rota utilize: http://localhost:3001

exemplo: http://localhost:3001/cars

  • /cars - Rota do tipo POST, é o caminho que deve ser acessado para criar um novo carro no banco de dados. Os atributos necessários para criar um carro, como modelo, ano, cor, quantidade de portas e assentos, entre outros, são especificados na tabela fornecida.

  • 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
    }
  • /cars - Rota do tipo GET, é o caminho para retornar e mostrar todos os carros salvos no banco de dados.

         [
           {
             "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
           }
         ]
       
    
  • /cars/:id - Rota do tipo GET, é o caminho para retornar e mostrar um carro especificado pelo seu id no banco de dados.

       {
         "id": "634852326b35b59438fbea2f",
         "model": "Marea",
         "year": 2002,
         "color": "Black",
         "status": true,
         "buyValue": 15.99,
         "doorsQty": 4,
         "seatsQty": 5
       }
     
    
  • /cars/:id - Rota do tipo PUT, é o caminho para atualizar um carro especificado pelo seu id no banco de dados.

  • 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
    }
  • /motorcycles - Rota do tipo POST, é o caminho que deve ser acessado para criar uma nova moto no banco de dados. Os atributos necessários para criar uma moto, como modelo, ano, cor, entre outros, são especificados na tabela fornecida.

  • 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
    }
  • /motorcycles - Rota do tipo GET, é o caminho para retornar e mostrar todas as motos salvas no banco de dados.

            [
              {
                "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
              }
            ]
          
    
  • /motorcycles/:id - Rota do tipo GET, é o caminho para retornar e mostrar uma moto especificada pelo seu id no banco de dados.

            {
              "id": "634852326b35b59438fbea31",
              "model": "Honda Cbr 1000rr",
              "year": 2011,
              "color": "Orange",
              "status": true,
              "buyValue": 59.900,
              "category": "Street",
              "engineCapacity": 1000
            }
  • /motorcycles/:id - Rota do tipo PUT, é o caminho para atualizar uma moto especificada pelo seu id no banco de dados.

  • 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
    }

Arquitetura de Software MSC

Optamos por utilizar a arquitetura MSC. que é uma estrutura de design de software que divide um aplicativo em três componentes principais: Model, Service e Controller.

  • Model: A camada Model é a representação de um objeto no banco de dados, com seus atributos e relacionamentos. Ela lida com a leitura e escrita de dados no banco de dados e fornece uma interface para manipular esses dados.

  • Service: A camada service é responsável por implementar a lógica de negócios do aplicativo. Ela geralmente encapsula uma ou mais operações do modelo e fornece uma camada adicional de abstração para o controller.

  • Controller: A camada controller é responsável por lidar com as requisições HTTP e coordenar as interações entre os modelos e os serviços. Ela recebe as solicitações do usuário e decide qual serviço ou modelo deve ser usado para lidar com essa solicitação.

Ao usar a arquitetura MSC, a lógica de negócios é separada da camada de apresentação e da camada de armazenamento de dados, o que torna o código mais modular e escalável. Além disso, a separação de responsabilidades torna mais fácil testar cada componente separadamente.

Aqui estão alguns benefícios da arquitetura MSC:

  • Organização: Com a divisão clara de responsabilidades, é mais fácil para os desenvolvedores entenderem e manterem o código.

  • Escalabilidade: Como cada componente é independente, é possível escalar o aplicativo de forma granular, sem precisar escalá-lo como um todo.

  • Reutilização de código: Como os serviços encapsulam a lógica de negócios, é possível reutilizar o mesmo serviço em várias partes do aplicativo.

  • Testabilidade: Como cada componente é independente, é mais fácil escrever testes automatizados para cada componente.


Testes

Foram implementados testes unitários durante o desenvolvimento da API para garantir seu correto funcionamento e evitar possíveis erros no código.

No back-end, foram implementados testes de unidade utilizando a biblioteca Mocha, o framework de asserção Chai e a biblioteca de simulação Sinon.


INSTALAÇÃO

⚠️ Configurações mínimas para execução do projeto

Na sua máquina você deve ter:

  • Sistema Operacional Distribuição Unix (Preferencialmente)
  • Node versão 16
  • Docker
  • Docker-compose versão >=1.29.2

➡️ O node deve ter versão igual ou superior à 16.14.0 LTS:

  • Para instalar o nvm, acesse esse link;
  • Rode os comandos abaixo para instalar a versão correta de node e usá-la:
    • nvm install 16.14 --lts
    • nvm use 16.14
    • nvm alias default 16.14

➡️ Odocker-compose deve ter versão igual ou superior àˆ1.29.2:



  • ⚠️ Antes de começar, seu docker-compose precisa estar na versão 1.29 ou superior. Veja aqui ou na documentação como instalá-lo. No primeiro artigo, você pode substituir onde está com 1.26.0 por 1.29.2.
  • ⚠️ 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
  • ⚠️ Se você se deparar com o erro abaixo, quer dizer que sua aplicação já esta utilizando a porta 3001, seja com outro processo do Node.js (que você pode parar com o comando killall node) ou algum container! Neste caso você pode parar o container com o comando docker stop <nome-do-container>


  • Clone o repositório git@github.com:Lucdainez/car_shop.git:
git clone git@github.com:Lucdainez/car_shop.git

  • Entre na pasta do repositório que você acabou de clonar:
cd car_shop

  • Rode o docker-compose com o comando:
docker-compose up -d

  • Entre no terminal interativo do docker com o comando:
docker exec -it car_shop bash

  • Instale as depëndencias, caso necessário, com npm install:
npm install


Executando a API:

  • Rode a API com o comando na raiz do projeto:

Executará a aplicação em modo de desenvolvimento.

npm run dev


Testando a API:

  • Execute os testes com o comando:

Executará os testes unitários.

npm run test:mocha


Contribuição

Contribuições são sempre bem-vindas! Para contribuir com o projeto, siga as instruções abaixo:

  • Fork este repositório

Crie uma nova branch com sua feature ou correção de bug:

git checkout -b sua-feature-ou-correcao
  • Faça as alterações necessárias e commit as mudanças:
git commit -m "sua mensagem de commit"
  • Envie suas alterações para seu repositório remoto:
git push origin sua-feature-ou-correcao
  • Crie um Pull Request para o repositório original.


Autor

Referências

Tecnologias e Ferramentas

Testes

  • Framework de teste de unidade: Jest
  • Framework de teste de unidade: Mocha
  • Biblioteca de assertividade para teste de unidade: Chai
  • Biblioteca de espiões, stubs e mocks para testes: Sinon