Skip to content

Desenvolvimento e arquitetura de uma API com um banco de dados MySQL

Notifications You must be signed in to change notification settings

priscilaSartori/project-store-manager

Repository files navigation

Project Store Manager

Descrição do Projeto

Desenvolvimento de uma API RESTful utilizando a arquitetura MSC (model-service-controller)! A API construída é um sistema de gerenciamento de vendas no formato dropshipping em que será possível criar, visualizar, deletar e atualizar produtos e vendas. Foi utilizado o banco de dados MySQL para a gestão de dados.

Habilidades desenvolvidas

  • Arquitetura de software: Model, Service e Controller.



Requisitos Obrigatórios

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 ordenado 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 obrigatoriamente;
  • 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 e funções 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.]

  • [Será validado que existe um mínimo de 2 funções em CADA camada models, services e controllers.]



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 obrigatoriamente;
  • 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 e funções 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.]
  • [Será validado que existe um mínimo de 3 funções em CADA camada models, services e controllers.]

06 - Crie endpoint para validar e cadastrar vendas

  • O endpoint de vendas deve ser acessível através do caminho (/sales);
  • As vendas enviadas devem ser salvas nas tabelas sales e sales_products do banco de dados;
  • Deve ser possível cadastrar a venda de vários produtos através da uma mesma requisição;
  • O corpo da requisição deverá seguir o formato abaixo:
[
  {
    "productId": 1,
    "quantity": 1
  },
  {
    "productId": 2,
    "quantity": 5
  }
]
Os seguintes pontos serão avaliados
  • [Será validado que não é possível realizar operações em uma venda sem o campo productId]

    • Se algum dos itens da requisição não tiver o campo productId, o resultado retornado deverá ser conforme exibido abaixo, com um status http 400:
    { "message": "\"productId\" is required" }
  • [Será validado que não é possível realizar operações em uma venda sem o campo quantity]

    • Se algum dos itens da requisição não tiver o campo quantity, o resultado retornado deverá ser conforme exibido abaixo, com um status http 400 :
    { "message": "\"quantity\" is required" }
  • [Será validado que não é possível realizar operações em uma venda com o campo quantity menor ou igual a 0 (Zero)]

    • Se a requisição tiver algum item em que o campo quantity seja menor ou igual a zero, o resultado retornado deverá ser conforme exibido abaixo, com um status http 422
    { "message": "\"quantity\" must be greater than or equal to 1" }
  • [Será validado que não é possível realizar operações em uma venda com o campo productId inexistente, em uma requisição com um único item]

    • Se o campo productId do item da requisição não existir no banco de dados, o resultado retornado deverá ser conforme exibido abaixo, com um status http 404
    { "message": "Product not found" }
  • [Será validado que não é possível realizar operações em uma venda com o campo productId inexistente, em uma requisição com vários items]

    • Se a requisição tiver algum item cujo campo productId não existe no banco de dados, o resultado retornado deverá ser conforme exibido abaixo, com um status http 404
    { "message": "Product not found" }
  • [Será validado que é possível cadastrar uma venda com sucesso]

    • Se a venda for criada com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 201:
    {
      "id": 3,
      "itemsSold": [
        {
          "productId": 1,
          "quantity": 1
        },
        {
          "productId": 2,
          "quantity": 5
        }
      ]
    }

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


07 - 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 obrigatoriamente;
  • 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 e funções 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.]

  • [Será validado que existe um mínimo de 4 funções em CADA camada models, services e controllers.]



08 - 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 ordenado de forma crescente pelo campo saleId, em caso de empate, ordenar 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
      }
    
      /* ... */
    ]


09 - 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 obrigatoriamente;
  • 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 e funções 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.]
  • [Será validado que existe um mínimo de 6 funções em CADA camada models, services e controllers.]

10 - 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"
    }


11 - 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 obrigatoriamente;
  • 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 e funções 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.]
  • [Será validado que existe um mínimo de 7 funções em CADA camada models, services e controllers.]

12 - 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

13 - 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 obrigatoriamente;
  • 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 e funções 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.]
  • [Será validado que existe um mínimo de 8 funções em CADA camada models, services e controllers.]

14 - Crie endpoint para deletar uma venda

  • O endpoint deve ser acessível através do caminho (/sales/:id);
  • Apenas a venda com o id presente na URL deve ser deletado;
Os seguintes pontos serão avaliados
  • [Será validado que não é possível deletar 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 deletar uma venda com sucesso]

    • Se a venda for deletada 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


15 - 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 obrigatoriamente;
  • 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 e funções 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.]
  • [Será validado que existe um mínimo de 9 funções em CADA camada models, services e controllers.]

16 - Crie endpoint para atualizar uma venda

  • O endpoint deve ser acessível através do caminho (/sales/:id);
  • Apenas a venda com o id presente na URL deve ser atualizada;
  • O corpo da requisição deve ser validado igual no cadastro;
  • O corpo da requisição deverá seguir o formato abaixo:
[
  {
    "productId": 1,
    "quantity": 10
  },
  {
    "productId": 2,
    "quantity": 50
  }
]
Os seguintes pontos serão avaliados
  • [Será validado que não é possível alterar 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 alterar uma venda com sucesso]

    • Se a venda for alterada com sucesso o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:
      "saleId": 1,
        "itemsUpdated": [
          {
            "productId": 1,
            "quantity":10
          },
          {
            "productId": 2,
            "quantity":50
          }
        ]


17 - 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 obrigatoriamente;
  • 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 e funções 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.]
  • [Será validado que existe um mínimo de 10 funções em CADA camada models, services e controllers.]

18 - Crie endpoint products/search?q=searchTerm

  • O endpoint deve ser acessível através do URL /products/search;

  • O endpoint deve ser capaz de trazer os produtos baseados no q do banco de dados, se ele existir;

  • Sua aplicação deve ser capaz de retornar um array de produtos que contenham em seu nome termo passado na URL;

  • Sua aplicação deve ser capaz de retornar um array vazio caso nenhum nome satisfaça a busca;

  • O query params da requisição deverá seguir o formato abaixo:

      http://localhost:PORT/products/search?q=Martelo
Os seguintes pontos serão avaliados
  • [Será validado que é possível buscar um produto pelo name]

    • Se a buscar for feita com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:
    // GET /products/search?q=Martelo
    
    [
      {
        "id": 1,
        "name": "Martelo de Thor"
      }
    ]
  • [Será validado que é possível buscar todos os produtos quando passa a busca vazia] - Se a buscar for vazia o resultado retornado deverá ser conforme exibido abaixo, com um status http 200:

    // GET /products/search?q=
    
          [
            {
              "id": 1,
              "name": "Martelo de Thor",
            },
            {
              "id": 2,
              "name": "Traje de encolhimento",
            }
            /* ... */
          ]
        ```
    
    

19 - 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 obrigatoriamente;
  • 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 e funções 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.]
  • [Será validado que existe um mínimo de 11 funções em CADA camada models, services e controllers.]

20 - Desenvolva testes que cubram no mínimo 60% 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 obrigatoriamente;
  • 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 e funções dos arquivos de CADA camada models, services e controllers é maior ou igual a 60%. Ou seja, cada uma das camadas tem de ter, ao menos, 60% de cobertura de testes.]
  • [Será validado que existe um mínimo de 11 funções em CADA camada models, services e controllers.]

About

Desenvolvimento e arquitetura de uma API com um banco de dados MySQL

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published