-O objetivo final do projeto é concluir uma aplicação de Backend CRUD funcional que maneje as operações de uma loja ficcional.
-O desenvolvimento deve seguir as regras do modelo MSC
e o padrão REST
. Erros devem ser seguidos de mensagens personalizadas e o devido e adequado código do status.
-Testes Unitários devem ser realizados para acompanhar o desenvolvimento seguro da aplicação.
- TODOS os endpoints devem retornar erros tratando as exceções, privilegiando a consistência da aplicação.
- NodeJS;
- MySQL;
- Express;
- Testes Unitários: Sinon, Chai;
- Joi;
- Caso deseje testar o projeto localmente o repositório acompanha um schema .sql para facilitar a implementação da aplicação.
- O projeto requer o uso das seguintes variáveis de ambiente para o devido funcionamento:
host: process.env.HOSTNAME
user: process.env.MYSQL_USER
password: process.env.MYSQL_PASSWORD
jwt_secret: process.env.JWT_SECRET
- Realização de testes para acompanhar o desenvolvimento da aplicação.
- O comando
npm run test:mocha
mostra o percentual da aplicação completo pelos testes.
-
O retorno do endpoint deve retornar um array de objetos com todos os produtos (/products) ou um objeto com o produto especificado (/products/:id);
-
Estrutura do retorno:
[ { "id": 1, "name": "Bola quadrada", "quantity": 10 }, { "id": 2, "name": "Havaiana de pau", "quantity": 20 } ]
{ "id": 1, "name": "Bola quadrada", "quantity": 10 }
- Será validado se o cadastro de um produto foi feito com os dados corretos;
- A verificação dos dados deve ser realizada por um middleware;
- Estrutura da requisição
/products
:{ "name": "Bola quadrada", // name.length > 5 "quantity": 100 }
- O retorno bem sucedido será o objeto acompanhado do Id de cadastro.
- Permite atualizar um produto já cadastrado, seguindo as regras já estabelecidas;
- O produto atualizado é observado através do id no parâmetro da URL;
- Estrutura da requisição:
[ { "name": "Bola quadrada", "quantity": 100 // quantity > 0 } ]
- O retorno bem sucedido será o objeto acompanhado do Id do produto alterado.
- Deleta um produto do banco de dados;
- O endpoint uma mensagem informando a deleção do produto e o status correspondente.
-
O retorno do endpoint deve retornar um array de objetos com todos os produtos (/sales) ou um objeto com o produto especificado (/sales/:id);
-
Estrutura do retorno:
[ { "saleId": 1, "date": "2021-09-09T04:54:29.000Z", "productId": 1, "quantity": 2 }, { "saleId": 2, "date": "2021-09-09T04:54:54.000Z", "productId": 2, "quantity": 2 } ]
[ { "date": "2021-09-09T04:54:29.000Z", "productId": 1, "quantity": 2 }, { "date": "2021-09-09T04:54:54.000Z", "productId": 2, "quantity": 2 } ]
- Será validado se o cadastro de uma venda foi feito com os dados corretos;
- A verificação dos dados deve ser realizada por um middleware;
- Estrutura da requisição
/sales
:[ { "productId": 1, // deve corresponder a um produto real no banco de dados "quantity": 3 }, { "productId": 2, "quantity": 5 } ]
- O retorno bem sucedido será um objeto com o Id da venda cadastrada e um array contendo os items da venda descritos na requisição.
- Permite atualizar uma venda já cadastrada, seguindo as regras já estabelecidas;
- A venda que será atualizada deve ser observada através do id no parâmetro da URL;
- Estrutura da requisição:
[ { "productId": 1, "quantity": 6 } ]
- O retorno bem sucedido será o objeto acompanhado do Id da venda alterado.
- Deleta um produto do banco de dados;
- O endpoint uma mensagem informando a deleção do produto e o status correspondente.
- A realização de novas vendas, a deleção ou atualização de vendas deve refletir na quantidade disponível em estoque do produto - que é controlado pelo banco de dados;
- A regra de negócio deve ser aplicada na camada correta;
- Não deve ser possível fechar uma venda caso não haja estoque disponível.
- Não deve haver uma quantidade negativa de produtos.
- Uso de JWT alteração do estoque;
- Alteração do código base para uso do Typescript;