Skip to content

API utilizando a arquitetura MSC (model-service-controller)

Notifications You must be signed in to change notification settings

annabia95/project-store-manager

Repository files navigation

Este projeto contém os requisitos realizados por Anna Beatriz Garcia Trajano de Sá enquanto estudava na Trybe 🚀

Project Store Manager

Neste projeto desenvolvi uma API utilizando a arquitetura MSC (model-service-controller)!

A API criada tinha como base um sistema de gerenciamento de vendas no formato dropshipping em que é possível criar, visualizar, deletar e atualizar produtos e vendas. Para gestão do banco de dados, utilizei o MySQL. Além disso, a API desenvolvida foi RESTful.

Arquitetura de Software - MSC

MSC
Screeshot

Demo

Demo


Instalação do projeto localmente:

Após cada um dos passos, haverá um exemplo do comando a ser digitado para fazer o que está sendo pedido, caso tenha dificuldades e o exemplo não seja suficiente, não hesite em me contatar em annagarcia@id.uff.br

  1. Abra o terminal e crie um diretório no local de sua preferência com o comando mkdir:
  mkdir projetos
  1. Entre no diretório que acabou de criar e depois clone o projeto:
  cd projetos
  git clone git@github.com:annabia95/project-store-manager.git
  1. Acesse o diretório do projeto e depois utilize o comando npm i para instalar todas as dependências necessárias:
  cd project-store-manager
  npm i
  • Dica: Caso queira utilizar Docker para rodar os testes localmente e validar as funcionalidades, basta seguir as seguintes instruções:

⚠️ 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.

ℹ️ Rode os serviços node e db com o comando docker-compose up -d.

  • Lembre-se de parar o mysql se estiver usando localmente na porta padrão (3306), ou adapte, caso queria fazer uso da aplicação em containers;
  • Esses serviços irão inicializar um container chamado store_manager e outro chamado store_manager_db;
  • A partir daqui você pode rodar o container store_manager via CLI ou abri-lo no VS Code.

ℹ️ Use o comando docker exec -it store_manager 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.

Habilidades Desenvolvidas

Neste projeto, desenvolvi as seguintes habilidades:

  • Arquitetar e desenvolver a API com um banco de dados MySQL;
  • Desenvolver endpoints para criar, exibir, atualizar e excluir produtos e vendas;
  • Aplicar testes unitários em cada camada do modelo MSC.

Referências

Documentação Oficial - Node.js
Documentação Express - Rotas
Chai Assertion Library
Stubs - Sinon.JS
Mocha
Bulletproof node.js project architecture
Artigo Trybe: Teste unitário: o que são, por que usar e por onde começar?

Escopo do Projeto

01 - Crie endpoints para listar produtos

  • O endpoint para listar produtos deve ser acessível através do caminho (/products) e (/products/:id);
  • Através do caminho /products, todos os produtos devem ser retornados;
  • Através do caminho /products/:id, apenas o produto com o id presente na URL deve ser retornado;
  • O resultado da listagem deve ser ordernado de forma crescente pelo campo id;
Os seguintes pontos serão avaliados
  • [Será validado que é possível listar todos os produtos]

    • Ao listar usuários com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:
      [
        {
          "id": 1,
          "name": "Martelo de Thor",
        },
        {
          "id": 2,
          "name": "Traje de encolhimento",
        }
        /* ... */
      ]
  • [Será validado que não é possível listar um produto que não existe]

    • Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http 404:
      { "message": "Product not found" }
  • [Será validado que é possível listar um produto específico com sucesso]

    • Ao listar um produto com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:
      {
        "id": 1,
        "name": "Martelo de Thor",
      }


02 - Desenvolva testes que cubram no mínimo 5% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 5%. Ou seja, cada uma das camadas tem de ter, ao menos, 5% de cobertura de testes.]


03 - Crie endpoint para cadastrar produtos

  • O endpoint deve ser acessível através do caminho (/products);
  • Os produtos enviados devem ser salvos na tabela products do banco de dados;
  • O corpo da requisição deverá seguir o formato abaixo:
  {
    "name": "ProdutoX"
  }
Os seguintes pontos serão avaliados
  • [Será validado que é possível cadastrar um produto com sucesso]
    • Se o produto for criado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 201:
      {
        "id": 4,
        "name": "ProdutoX"
      }


04 - Crie validações para produtos

  • O endpoint de produtos deve ser acessível através do caminho (/products);
  • Lembre-se, o banco de dados não deve ser acessado nas validações iniciais do corpo da requisição;
Os seguintes pontos serão avaliados
  • [Será validado que não é possível realizar operações em um produto sem o campo name]

    • Se a requisição não tiver o campo name, o resultado retornado deverá ser conforme exibido abaixo, com um status http 400 :
      { "message": "\"name\" is required" }
  • [Será validado que não é possível realizar operações em um produto com o campo name menor que 5 caracteres]

    • Se a requisição não tiver name com pelo menos 5 caracteres, o resultado retornado deverá ser conforme exibido abaixo, com um status http 422
      { "message": "\"name\" length must be at least 5 characters long" }


05 - Desenvolva testes que cubram no mínimo 10% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 10%. Ou seja, cada uma das camadas tem de ter, ao menos, 10% de cobertura de testes.]


06 - Desenvolva testes que cubram no mínimo 15% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 15%. Ou seja, cada uma das camadas tem de ter, ao menos, 15% de cobertura de testes.]


07 - Crie endpoints para listar vendas

  • O endpoint para listar vendas deve ser acessível através do caminho (/sales) e (/sales/:id);
  • Através do caminho /sales, todas as vendas devem ser retornadas;
  • Através do caminho /sales/:id, apenas a venda com o id presente na URL deve ser retornada;
  • o resultado deve ser ordernado de forma crescente pelo campo saleId, em caso de empate, ordernar também de forma crescente pelo campo productId;
Os seguintes pontos serão avaliados
  • [Será validado que é possível listar todas as vendas]

    • Ao listar vendas com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:
      [
        {
          "saleId": 1,
          "date": "2021-09-09T04:54:29.000Z",
          "productId": 1,
          "quantity": 2
        },
        {
          "saleId": 1,
          "date": "2021-09-09T04:54:54.000Z",
          "productId": 2,
          "quantity": 2
        }
    
        /* ... */
      ]
  • [Será validado que não é possível listar uma venda que não existe]

    • Se a venda for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http 404:
      { "message": "Sale not found" }
  • [Será validado que é possível listar uma venda específica com sucesso]

    • Ao listar uma venda com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:
      [
        {
          "date": "2021-09-09T04:54:29.000Z",
          "productId": 1,
          "quantity": 2
        },
        {
          "date": "2021-09-09T04:54:54.000Z",
          "productId": 2,
          "quantity": 2
        }
    
        /* ... */
      ]


08- Desenvolva testes que cubram no mínimo 20% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 20%. Ou seja, cada uma das camadas tem de ter, ao menos, 20% de cobertura de testes.]


9 - Crie endpoint para atualizar um produto

  • O endpoint deve ser acessível através do caminho (/products/:id);
  • Apenas o produto com o id presente na URL deve ser atualizado;
  • O corpo da requisição deve ser validado igual no cadastro;
  • O corpo da requisição deverá seguir o formato abaixo:
  {
    "name": "Martelo do Batman"
  }
Os seguintes pontos serão avaliados
  • [Será validado que não é possível alterar um produto que não existe]

    • Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http 404:
      { "message": "Product not found" }
  • [Será validado que é possível alterar um produto com sucesso]

    • Se o produto for alterado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:
      {
        "id": 1,
        "name": "Martelo do Batman"
      }


10 - Desenvolva testes que cubram no mínimo 25% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 25%. Ou seja, cada uma das camadas tem de ter, ao menos, 25% de cobertura de testes.]


11 - Crie endpoint para deletar um produto

  • O endpoint deve ser acessível através do caminho (/products/:id);
  • Apenas o produto com o id presente na URL deve ser deletado;
Os seguintes pontos serão avaliados
  • [Será validado que não é possível deletar um produto que não existe]

    • Se o produto for inexistente o resultado retornado deverá ser conforme exibido abaixo, com um status http 404:
      { "message": "Product not found" }
  • [Será validado que é possível deletar um produto com sucesso]

    • Se o produto for deletado com sucesso não deve ser retornada nenhuma resposta, apenas um status http 204;

💬 Em caso de dúvidas, lembre-se de consultar a seção Diagrama ER, Entidades e Scripts


Requisitos Bônus

12 - Desenvolva testes que cubram no mínimo 30% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 30%. Ou seja, cada uma das camadas tem de ter, ao menos, 30% de cobertura de testes.]


13 - Desenvolva testes que cubram no mínimo 35% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 35%. Ou seja, cada uma das camadas tem de ter, ao menos, 35% de cobertura de testes.]


14 - Desenvolva testes que cubram no mínimo 40% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 40%. Ou seja, cada uma das camadas tem de ter, ao menos, 40% de cobertura de testes.]


15 - Desenvolva testes que cubram no mínimo 50% das camadas da sua aplicação

  • Seus arquivos de teste devem ficar no diretório tests/unit, como é descrito em Para escrever seus próprios arquivos de teste;
  • Seus testes da model devem fazer mock do banco de dados obrigatóriamente;
  • Opcionalmente você pode parar o serviço do MYSQL em sua máquina. Para rodar seus teste utilize npm run test:mocha;
  • Antes de executar os testes da Trybe, seus testes não devem conter erros.
Os seguintes pontos serão avaliados
  • [Será validado que a cobertura total das linhas dos arquivos de CADA camada models, services e controllers é maior ou igual a 50%. Ou seja, cada uma das camadas tem de ter, ao menos, 50% de cobertura de testes.]


Releases

No releases published

Packages

No packages published