Skip to content

API de um sistema de gerenciamento de vendas em arquitetura MSC, Node.js e Express, testes unitários mocha, chai.

Notifications You must be signed in to change notification settings

legalvao1/Project-store-manager

Repository files navigation

Projeto Store Manager!

Este projeto faz parte da formação Full Stack da Trybe.

Introdução

Neste projeto o objetivo era desenvolver nossa primeira API, que se tratava de um sistema de gerenciamento de vendas, onde a pessoa usuária, independente de cadastramento ou login, possa adicionar, ler, deletar e atualizar produtos no seu estoque. O usuário deve poder também enviar vendas para o sistema. Essas vendas devem validar se o produto em questão existe. Deve, também, ser possível ler, deletar e atualizar vendas, utilizando a arquitetura MSC.

Habilidades

As habilidades a serem desenvolvidas:

  • Entender o funcionamento da camada de Model;
  • Delegar responsabilidades específicas para essa camada;
  • Conectar sua aplicação com diferentes bancos de dados(nesse caso MongoDB);
  • Estruturar uma aplicação em camadas;
  • Delegar responsabilidades específicas para cada parte do seu app;
  • Melhorar manutenibilidade e reusabilidade do seu código;
  • Entender e aplicar os padrões REST;
  • Escrever assinaturas para APIs intuitivas e facilmente entendíveis.


## Lista de requisitos

### 1 - Crie um endpoint para o cadastro de produtos

- O endpoint deve ser acessível através do caminho (`/products`);

- Os produtos enviados devem ser salvos em uma **collection** do MongoDB;

- O endpoint deve receber a seguinte estrutura:

```json
{
  "name": "product_name",
  "quantity": "product_quantity"
}

O retorno da API de um produto cadastrado com sucesso deverá ser:

{
  "_id": "5f43a7ca92d58904914656b6",
  "name": "Produto do Batista",
  "quantity": 100
}

Requisição de Cadastro de Produtos:

O projeto deve rodar na porta http://localhost:3000

Criar produtos

Observações Técnicas:

  • name deve ser uma string com mais de 5 caracteres e deve ser único;

  • quantity deve ser um número inteiro maior que 0;

  • Cada produto deve ter um id que seja único e gerado no momento em que o recurso for criado. Você pode utilizar o ID gerado pelo MongoDB

  • A resposta do endpoint em caso de sucesso deve ser o produto criado.

2 - Crie um endpoint para listar os produtos

  • O endpoint deve ser acessível através do caminho (/products) ou (/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 que será verificado:

  • Será validado que todos produtos estão sendo retornados

    • Se a lista retornar com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Lista de produtos

  • Será validado que é possível listar um determinado produto

    • Se a lista retornar com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Listar um produto

  • Será validado que não é possível listar um produto que não existe

    • Se a lista retornar com falha, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Produto não existe

3 - Crie um endpoint para atualizar um produto

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

  • O corpo da requisição deve seguir a mesma estrutura do método responsável por adicionar um produto;

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

O que será verificado:

  • Será validado que não é possível atualizar um produto com o nome menor que 5 caracteres

    • Se o produto tiver o nome menor que cinco caracteres, o resultado retornado deverá ser conforme exibido abaixo, com status 422:

Atualizar com nome menor que cinco (As contrabarras \ estão escapando as aspas de dentro da string)

  • Será validado que não é possível atualizar um produto com quantidade menor que zero

    • Se o produto tiver o quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Atualizar menor que zero (As contrabarras \ estão escapando as aspas de dentro da string)

  • Será validado que não é possível atualizar um produto com quantidade igual a zero

    • Se o produto tiver o quantidade igual a zero, o resultado mostrado deverá ser conforme exibido abaixo, com status http 422:

Atualizar igual a zero (As contrabarras \ estão escapando as aspas de dentro da string)

  • Será validado que não é possível atualizar um produto com uma string no campo quantidade

    • Se o produto tiver o quantidade como string, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Atualizar com string (As contrabarras \ estão escapando as aspas de dentro da string)

  • Será validado que é possível atualizar um produto com sucesso]**

    • Se o produto atualizado com sucesso, o resultado mostrretornadoado deverá ser conforme exibido abaixo, com status http 200:

Atualizado com sucesso

4 - Crie um 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;

O que será verificado:

  • Será validado que é possível deletar um produto com sucesso

    • Se o produto deletado com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Deletar um produto

  • Será validado que não é possível deletar um produto que não existe

    • Se o produto não for deletado com sucesso, o resultado retornado deverá ser esse e com status http 422:

Deletar um produto que não existe

5 - Crie um endpoint para cadastrar vendas

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

  • As vendas enviadas devem ser salvas em uma collection do MongoDB;

  • Deve ser possível cadastrar a venda de vários produtos através da uma mesma requisição;

  • O endpoint deve receber a seguinte estrutura:

[
  {
  "productId": "product_id",
  "quantity": "product_quantity",
  },
  ...
]

O retorno de uma venda cadastrada com sucesso deverá ser:

{
  "_id": "5f43ba333200020b101fe4a0",
  "itensSold": [
    {
      "productId": "5f43ba273200020b101fe49f",
      "quantity": 2
    }
  ]
}

Observações Técnicas:

  • O productId devem ser igual ao id de um produto anteriormente cadastrado;

  • quantity deve ser um número inteiro maior que 0;

  • Cada venda deve ter um id que seja único e gerado no momento em que o recurso for criado;

  • A resposta do endpoint em caso de sucesso deve ser a(s) venda(s) criada(s).

O que será verificado:

  • Será validado que não é possível cadastrar vendas com quantidade menor que zero

    • Se a venda tiver uma quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Vendas menor que zero

  • Será validado que não é possível cadastrar vendas com quantidade igual a zero

    • Se a venda tiver uma quantidade igual a zero, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Vendas igual a zero

  • Será validado que não é possível cadastrar vendas com uma string no campo quantidade

    • Se a venda tiver uma quantidade com valor, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Vendas com string

  • Será validado que é possível criar uma venda com sucesso

    • Se a venda foi feita com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Cadastro de venda com sucesso

  • Será validado que é possível criar várias vendas com sucesso

    • Se as vendas foi feita com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Cadastrar varias compras

6 - Crie um endpoint para listar as vendas

  • O endpoint deve ser acessível através do caminho (/sales) ou (/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 que será verificado:

  • Será validado que todas as vendas estão sendo retornadas

    • Se todas vendas estão sendo listadas, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Listar todas as vendas

  • Será validado que é possível listar uma determinada venda

  • Se a venda esta sendo listada, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Listar uma venda

  • Será validado que não é possível listar uma venda inexistente

    • Se a venda não esta sendo listada, o resultado retornado deverá ser conforme exibido abaixo, com status http 404:

Listar uma venda que não existe

7 - Crie um endpoint para atualizar uma venda

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

  • O corpo da requisição deve receber a seguinte estrutura:

[
  {
    "productId": "5f3ff849d94d4a17da707008",
    "quantity": 3
  }
]
  • quantity deve ser um número inteiro maior que 0;

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

O que será verificado:

  • Será validado que não é possível atualizar vendas com quantidade menor que zero

    • Se a venda tiver uma quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Atualizar venda menor que zero

  • Será validado que não é possível atualizar vendas com quantidade igual a zero

    • Se a venda tiver uma quantidade igual a zero, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Atualizar venda igual zero

  • Será validado que não é possível atualizar vendas com uma string no campo quantidade

    • Se a venda tiver uma quantidade do tipo string, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Atualizar venda com string

  • Será validado que é possível atualizar uma vendas com sucesso

    • Se a venda for atualizada com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 200:

Atualizar uma venda com sucesso

8 - Crie um 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;

O que será verificado:

  • Será validado que é possível deletar uma venda com sucesso

    • Se a venda foi deletada sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 200 e será verificado depois que a venda não existe, com um GET nesse id, e este deverá retornar status http 404, como é validado no requisito 6:

Deletar uma venda com sucesso

  • Será validado que não é possível deletar uma venda que não existe

    • Se a venda não foi deletada sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Deletar uma venda que não existe

9 - Atualize a quantidade de produtos

  • Ao realizar uma venda, atualizá-la ou deletá-la, você deve também atualizar a quantidade do produto em questão presente na collection responsável pelos produtos;

  • Por exemplo: suponha que haja um produto chamado Bola de Futebol e a sua propriedade quantity tenha o valor 10. Caso seja feita uma venda com 8 unidades desse produto, a quantidade do produto deve ser atualizada para 2 , pois 10 - 8 = 2;

O que será verificado:

  • Será validado que é possível a quantidade do produto atualize ao fazer uma compra

    • Ao fazer uma determinada venda, a quantidade do produto deverá ser atualizada.
  • Será validado que é possível a quantidade do produto atualize ao deletar uma compra

    • Ao fazer deletar uma determinada venda, a quantidade do produto deverá ser atualizada para a quantidade que tinha antes de ter feito essa venda.

10 - Valide a quantidade de produtos

  • Um produto nunca deve ter a quantidade em estoque menor que 0;

  • Quando uma venda for realizada, garanta que a quantidade sendo vendida está disponível no estoque

O que será verificado:

  • Será validado que o estoque do produto nunca fique com a quantidade menor que zero

    • Um produto não poderá ficar com a quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http 404:

Compra maior que a quantidade

Bônus

11 - Escreva testes para seus models

  • Utilize o mocha, chai e sinon para escrever seus testes

  • Coloque todos os testes de models no arquivo test/unit/models.js

  • Será validado que cobertura total das linhas dos arquivos na pasta models é maior ou igual a 80%

12 - Escreva testes para seus services

  • Utilize o mocha, chai e sinon para escrever seus testes

  • Coloque todos os testes de services no arquivo test/unit/services.js

  • Será validado que cobertura total das linhas dos arquivos na pasta services é maior ou igual a 80%

13 - Escreva testes para seus controllers

  • Utilize o mocha, chai e sinon para escrever seus testes

  • Coloque todos os testes de controllers no arquivo test/unit/controllers.js

  • Será validado que cobertura total das linhas dos arquivos na pasta controllers é maior ou igual a 80%


Para iniciar o desenvolvimento, é necessário clonar o repositório do GitHub, acessar o projeto Store Manager e intalar as dependências:

cd "diretorio de sua preferencia"

git clone git@github.com:legalvao1/Project-store-manager.git

cd Project-store-manager

npm install

About

API de um sistema de gerenciamento de vendas em arquitetura MSC, Node.js e Express, testes unitários mocha, chai.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published