Skip to content

flavioCoder1/Store-ManagerAPI-GIT

Repository files navigation

Seja muito bem-vindo ao meu repositório do projeto Store Manager!


Requisitos

- [1 - Criei um endpoint para o cadastro de produtos](#1---crie-um-endpoint-para-o-cadastro-de-produtos)
- [2 - Criei um endpoint para listar os produtos](#2---crie-um-endpoint-para-listar-os-produtos)
- [3 - Criei um endpoint para atualizar um produto](#3---crie-um-endpoint-para-atualizar-um-produto)
- [4 - Criei um endpoint para deletar um produto](#4---crie-um-endpoint-para-deletar-um-produto)
- [5 - Criei um endpoint para cadastrar vendas](#5---crie-um-endpoint-para-cadastrar-vendas)
- [6 - Criei um endpoint para listar as vendas](#6---crie-um-endpoint-para-listar-as-vendas)
- [7 - Criei um endpoint para atualizar uma venda](#7---crie-um-endpoint-para-atualizar-uma-venda)
- [8 - Criei um endpoint para deletar uma venda](#8---crie-um-endpoint-para-deletar-uma-venda)
- [9 - Atualizei a quantidade de produtos](#9---atualize-a-quantidade-de-produtos)
- [10 - Validei a quantidade de produtos](#10---valide-a-quantidade-de-produtos)

Habilidades

Habilidades que eu desenvolvi nesse projeto:

  • Entender o funcionamento da camada de Model;
  • Delegar responsabilidades específicas para essa camada;
  • Conectar sua aplicação com diferentes bancos de dados;
  • 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.

O que foi desenvolvido

Eu desenvolvi uma API utilizando a arquitetura MSC(Model-Service-Controller)!

A API trata-se de um sistema de gerenciamento de vendas, onde será possível criar, visualizar, deletar e atualizar produtos e vendas.


Desenvolvimento

Eu desenvolvi todas as camadas da API (Models, Services caso necessário, e Controllers).

Através dessa aplicação, será possível realizar as operações básicas que se pode fazer em um determinado banco de dados: Criação, Leitura, Atualização e Exclusão (ou CRUD, para as pessoas mais mais íntimas 😜).

Foi utilizado o banco MongoDB para a gestão de dados. Além disso, a API deve ser RESTful.

⚠️ Importante ⚠️:

  • Deve ser possível que 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.

  • Para todos os endpoints:

    • Caso o recurso não seja encontrado, sua API retorne o status HTTP adequado com o body { message: '<recurso> não encontrado' }.
    • Em caso de erro, sua API retorne o status HTTP adequado com o body { err: { message: <mensagem de erro>, code: <código do erro> } }.
      • O código do erro deve ser determinado por você e deve seguir o mesmo padrão para toda a aplicação. Por exemplo: 'not_found', 'invalid_data' e afins.
    • Em caso de dados inválidos, sua API retorne o status HTTP adequado, com o body { err: { message: 'Dados inválidos', code: <código do erro> } }.
    • Todos os retornos de erro devem seguir o mesmo formato. Para erros que requerem dados adicionais (por exemplo, para informar quais campos estão incorretos) utilize a propriedade data dentro do objeto err.
    • Para gerar os objetos de erro personalizados, você pode utilizar uma biblioteca de erros, como o boom.

Clone o projeto para testar:

  1. Clone o repositório
  • git clone git@github.com:flavioCoder1/Store-ManagerAPI-GIT.git.
  • Entre na pasta do repositório que você acabou de clonar:
    • cd Store-ManagerAPI-GIT
  1. Instale as dependências
  • npm install
  1. Inicie o serviço do banco de dados mongoDB https://www.npmjs.com/package/mongodb
  • Para iniciar o banco : sudo systemctl start mongod. service (se não tiver instalado ainda npm i mongodb)

  • Para resetar o banco: sudo service mongod restart

  • Para entrar no banco: mongod

  1. Rode o mongoDB e o Node e execute as requisições onde preferir (Utilizei o Insomnia)

Todos os meus endpoints estão no padrão REST

Tabelas

O banco terá duas tabelas: produtos e vendas

A tabela de produtos deverá ter o seguinte nome: products

Os campos da tabela products terão esse formato:

{ "name": "Produto Silva", "quantity": 10 }

A resposta do insert que deve retornar após a criação é parecida essa:

{ "_id": ObjectId("5f43cbf4c45ff5104986e81d"), "name": "Produto Silva", "quantity": 10 }

(O _id será gerado automaticamente)

A tabela de vendas deverá ter o seguinte nome: sales

Os campos da tabela sales terão esse formato:

{ "itensSold": [{ "productId": "5f43cbf4c45ff5104986e81d", "quantity": 2 }] }

A resposta do insert que deve retornar após a criação é parecida essa:

{
  "_id": ObjectId("5f43cc53c45ff5104986e81e"),
  "itensSold": [{ "productId": "5f43cbf4c45ff5104986e81d", "quantity": 2 }]
}

(O _id será gerado automaticamente)


Testes

Usaremos o Jest e o [Frisby] para fazer os testes de api.

Este projeto já vem configurado e com suas dependências

Para poder executar os testes basta executar comando npm tests e o resultado será igual o abaixo:

Testes

Dica: desativando testes

Especialmente no início, quando a maioria dos testes está falhando, a saída após executar os testes é bastante poluída. Você pode desabilitar temporariamente um teste utilizando a função skip junto à função it. Como o nome indica, esta função "pula" um teste:

it.skip('it includes the text `Movie Cards Library` inside a h1 tag', () => {
  wrapper = shallow(<Header />);

  expect(wrapper.find('header h1').text()).toBe('Movie Cards Library');
});

Na saída da execução dos testes, você verá um indicando que o teste está sendo pulado:

image

Endpoints desenvolvidos no projeto

1 - Criei um endpoint para o cadastro de produtos método POST no endpoint /products

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

{
  "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.

O que será verificado:

  • Será validado que não é possível criar 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 um status http 422:

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

  • Será validado que não é possível criar um produto com o mesmo nome de outro já existente

    • Se o produto tiver o mesmo nome o resultado retornado deverá ser conforme exibido abaixo, com status http 422:

Mesmo nome

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

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

Menor que 0 (As contrabarras \ estão escapando as aspas de dentro da string)

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

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

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

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

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

Quantidade como string (As contrabarras \ estão escapando as aspas de dentro da string)

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

    • Se o produto for cadastrado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com status http 201:

Criar produtos

2 - Criei um endpoint para listar os produtos método GET no endpoint /products ou /products/:id

  • 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 - Criei um endpoint para atualizar um produto método PUT no endpoint /products/:id

  • 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 - Criei um endpoint para deletar um produto método DELETE no endpoint /products/:id

  • 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 - Criei um endpoint para cadastrar vendas método POST no endpoint /sales

  • 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 - Criei um endpoint para listar as vendas método GET no endpoint /sales ou /sales/:id

  • 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 - Criei um endpoint para atualizar uma venda método PUT no endpoint /sales/:id

  • 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 método DELETE no endpoint /sales/:id

  • 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


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published