- [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 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.
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.
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.
-
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.
- O código do erro deve ser determinado por você e deve seguir o mesmo padrão para toda a aplicação. Por exemplo:
- 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
datadentro do objetoerr. - Para gerar os objetos de erro personalizados, você pode utilizar uma biblioteca de erros, como o
boom.
- Caso o recurso não seja encontrado, sua API retorne o status HTTP adequado com o body
- 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
- Instale as dependências
npm install
- 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 aindanpm i mongodb) -
Para resetar o banco:
sudo service mongod restart -
Para entrar no banco:
mongod
- Rode o mongoDB e o Node e execute as requisições onde preferir (Utilizei o Insomnia)
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)
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:
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:
-
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
}O projeto deve rodar na porta http://localhost:3000
-
namedeve ser uma string com mais de 5 caracteres e deve ser único; -
quantitydeve 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:
- Se o produto tiver o nome menor que cinco caracteres o resultado retornado deverá ser conforme exibido abaixo, com um status http
(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:
- Se o produto tiver o mesmo nome o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se o produto tiver uma quantidade menor que zero o resultado retornado deverá ser conforme exibido abaixo, com status http
(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:
- Se o produto tiver uma quantidade igual a zero o resultado retornado deverá ser conforme exibido abaixo, com status http
(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:
- Se o produto tiver uma quantidade com o valor em string o resultado retornado deverá ser conforme exibido abaixo, com status http
(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:
- Se o produto for cadastrado com sucesso o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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 oidpresente 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:
- Se a lista retornar com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a lista retornar com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a lista retornar com falha, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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
idpresente 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:
- Se o produto tiver o nome menor que cinco caracteres, o resultado retornado deverá ser conforme exibido abaixo, com status
(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:
- Se o produto tiver o quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http
(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:
- Se o produto tiver o quantidade igual a zero, o resultado mostrado deverá ser conforme exibido abaixo, com status http
(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:
- Se o produto tiver o quantidade como string, o resultado retornado deverá ser conforme exibido abaixo, com status http
(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:
- Se o produto atualizado com sucesso, o resultado mostrretornadoado deverá ser conforme exibido abaixo, com status http
-
O endpoint deve ser acessível através do caminho (
/products/:id); -
Apenas o produto com o
idpresente 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:
- Se o produto deletado com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se o produto não for deletado com sucesso, o resultado retornado deverá ser esse e com status http
-
O endpoint deve ser acessível através do caminho (
/sales); -
As vendas enviadas devem ser salvas em uma
collectiondo 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
}
]
}-
O
productIddevem ser igual aoidde um produto anteriormente cadastrado; -
quantitydeve 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:
- Se a venda tiver uma quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a venda tiver uma quantidade igual a zero, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a venda tiver uma quantidade com valor, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a venda foi feita com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se as vendas foi feita com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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 oidpresente 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:
- Se todas vendas estão sendo listadas, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
-
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:
- Se a venda não esta sendo listada, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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
}
]-
quantitydeve ser um número inteiro maior que 0; -
Apenas a venda com o
idpresente 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:
- Se a venda tiver uma quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a venda tiver uma quantidade igual a zero, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a venda tiver uma quantidade do tipo string, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a venda for atualizada com sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
O endpoint deve ser acessível através do caminho (
/sales/:id); -
Apenas a venda com o
idpresente 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
200e será verificado depois que a venda não existe, com um GET nesseid, e este deverá retornar status http404, como é validado no requisito 6:
- Se a venda foi deletada sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
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:
- Se a venda não foi deletada sucesso, o resultado retornado deverá ser conforme exibido abaixo, com status http
-
Ao realizar uma venda, atualizá-la ou deletá-la, você deve também atualizar a quantidade do produto em questão presente na
collectionresponsável pelos produtos; -
Por exemplo: suponha que haja um produto chamado Bola de Futebol e a sua propriedade
quantitytenha 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.
-
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:
- Um produto não poderá ficar com a quantidade menor que zero, o resultado retornado deverá ser conforme exibido abaixo, com status http
- Projeto proposto pela Trybe e requisitos desenvolvidos por Flavio Cordeiro
























