Tabela de conteúdos
- ➤ Sobre o projeto
- ➤ Tecnologias utilizadas
- ➤ Descrição do projeto
- ➤ Instruções
- ➤ Requisitos realizados
- ➤ Requisito 1: Criação de endpoints para listar produtos
- ➤ Requisito 2: Desenvolvimento de testes para cobertura de 5%
- ➤ Requisito 3: Criação de endpoint para cadastrar produtos
- ➤ Requisito 4: Criação de validações para produtos
- ➤ Requisito 5: Desenvolvimento de testes para cobertura de 10%
- ➤ Requisito 6: Criação de endpoint para validar e cadastrar vendas
- ➤ Requisito 7: Desenvolvimento de testes para cobertura de 15%
- ➤ Requisito 8: Criação de endpoints para listar vendas
- ➤ Requisito 9: Desenvolvimento de testes para cobertura de 20%
- ➤ Requisito 10: Criação de endpoint para atualizar um produto
- ➤ Requisito 11: Desenvolvimento de testes para cobertura de 25%
- ➤ Requisito 12: Criação de endpoint para deletar um produto
- ➤ Requisito 13: Desenvolvimento de testes para cobertura de 30%
- ➤ Requisito 14: Criação de endpoint para deletar uma venda
- ➤ Requisito 15: Desenvolvimento de testes para cobertura de 35%
- ➤ Requisito 16: Criação de endpoint para atualizar uma venda
- ➤ Requisito 17: Desenvolvimento de testes para cobertura de 40%
- ➤ Requisito 18: Criação de endpoint para busca de produtos por termo
- ➤ Requisito 19: Desenvolvimento de testes para cobertura de 50%
- ➤ Requisito 20: Desenvolvimento de testes para cobertura de 60%
- ➤ Créditos
Projeto desenvolvido durante a formação de BackEnd na Trybe com o intuito de consolidar o aprendizado de NodeJs, utilizando o padrão de arquitetura MSC e o padrão arquitetural de APIs REST, bem como o framework de testes Mocha junto às libraries Chai e Sinon.
Descrição
Foi construída uma API para funcionar como um sistema de gerenciamento de vendas no formato dropshipping, no qual é possível criar, visualizar, deletar e atualizar produtos e vendas. Tem-se os arquivos (`migration.sql` e `seed.sql`) que foram utilizados para criação e população do banco de dados.
Neste projeto eu realizei:
- Utilização do banco de dados MySQL para gestão de dados
- Construção de um CRUD onde o usuário não depende de cadastro para interagir
- Validação de dados enviados nas requisições para alterar ou cadastrar vendas e produtos
- Utilização do padrão REST para garantir que: os endpoints sempre retornem respostas com códigos de status corretos, os verbos http são adequados para cada operação e, as URLs estão agrupadas e padronizadas em cada recurso
- Utilização da arquitetura MSC para garantir que: o banco de dados seja acessado somente pelo Model, que o Service seja responsável pelas regras de negócio e, que o Controller seja responsável por receber as requisições e enviar as respostas
Durante o desenvolvimento foi utilizado Docker para evitar a restauração manual do banco de dados.
- Clone o repositório
git clone git@github.com:Gabrielle-Murat/NodeJs-StoreManager.git
- Entre na pasta do repositório que você acabou de clonar;
- Instale as dependências:
npm install
- Como restaurar o banco de dados, se necessário:
- Abra o MySQL Workbench,
- Abra uma nova aba de query e cole dentro dela todo o conteúdo dos arquivos:
migration.sql
e, logo abaixo,seed.sql
, - Execute a query e aguarde alguns segundos,
- Atualize a lista de dbs;
- Utilizando Docker:
- Rode os serviços
node
edb
com o comandodocker-compose up -d
(adapte a porta padrão, se necessário), - Com isso, serão inicializados dois containers:
store_manager
estore_manager_db
- Use o comando
docker exec -it store_manager bash
(para acessar o terminal interativo do containerstore_manager
), - As credenciais de acesso ao db estão definidas no arquivo
docker-compose.yml
, sendo acessíveis no container através das variáveis de ambienteMYSQL_USER
eMYSQL_PASSWORD
- Instale as dependências com
npm install
- Todos os comandos disponíveis no
package.json
agora podem ser executados no terminal do container
- Configurando as variáveis de ambiente:
- Cria um arquivo .env na raiz do projeto com as variáveis de ambiente
- O arquivo terá o seguinte formato:
MYSQL_HOST=localhost MYSQL_USER=nome MYSQL_PASSWORD=senha MYSQL_DATABASE=StoreManager PORT=portaParaConexãoComOServidor
- As variáveis de ambiente já estão configuradas no arquivo
connection.js
na pasta models;
- Para iniciar o servidor em modo de desenvolvimento:
- Execute o comando:
npm run debug
Criação de API:
1. Criar dois endpoints para listar: todos os produtos e, o produto baseado no id da rota:
1.1. Listar todos os produtos através do caminho `/products`.
1.2. Listar apenas o produto com o `id` presente na rota através do caminho `/products/:id`.
1.3. Listar o resultado de forma crescente pelo campo `id`.
2. Desenvolver testes para cobrir 5% de cada camada da aplicação:
2.1. Os testes da camada model devem mockar o db.
3. Criar um endpoint para cadastrar produtos:
3.1. Cadastrar produtos através do caminho `/products`.
3.2. Os produtos devem ser salvos na tabela correta do db.
3.3. O corpo da requisição deve conter o campo `name`
4. Validar o campo `name` recebido no corpo da requisição:
4.1. As validações devem retornar os status corretos e suas respectivas mensagens de erros.
4.2. Não deve ser possível realizar operações em um produto sem o campo `name`.
4.3. O campo `name` deve possuir ao menos 5 caracteres.
5. Desenvolver testes para cobrir 10% de cada camada da aplicação:
5.1. Os testes da camada model devem mockar o db.
6. Criar um endpoint para cadastrar vendas:
6.1. Cadastrar vendas através do caminho `/sales`.
6.2. As vendas enviadas devem ser salvas nas tabelas: `sales` e `sales_products` do db.
6.3. Deve ser possível cadastrar a venda de vários produtos na mesma requisição.
6.4. O corpo da requisição deve conter um array de objetos, onde cada objeto representa um produto.
6.5. Cada objeto possui as seguintes chaves: `productId` e `quantity`.
6.6. Não deve ser possível realizar operações em uma venda sem os campos `productId` e `quantity`.
6.7. O campo `quantity` deve ser maior que zero.
6.8. Não deve ser possível realizar operações em uma venda se o campo `id` não existir no db.
7. Desenvolver testes para cobrir 15% de cada camada da aplicação:
7.1. Os testes da camada model devem mockar o db.
8. Criar dois endpoints para listar: todos os produtos e, o produto baseado no id da rota:
8.1. Listar todos as vendas através do caminho `/sales`.
8.2. Listar apenas a venda com o `id` presente na rota através do caminho `/sales/:id`.
8.3. Listar o resultado de forma crescente pelo campo `saleId`.
8.4. Em caso de empate: listar de forma crescente pelo campo `productId`.
9. Desenvolver testes para cobrir 20% de cada camada da aplicação:
9.1. Os testes da camada model devem mockar o db.
10. Criar um endpoint para atualizar um produto baseado no id da rota:
10.1. Atualizar produtos através do caminho `/products/:id`.
10.2. O corpo da requisição deve conter o campo `name`.
10.3. Validar o corpo da requisição assim como no cadastro.
10.4. Não deve ser possível alterar um produto que não existe no db.
11. Desenvolver testes para cobrir 25% de cada camada da aplicação:
11.1. Os testes da camada model devem mockar o db.
12. Criar um endpoint para deletar um produto baseado no id da rota:
12.1. Deletar produtos através do caminho `/products/:id`.
12.2. Não deve ser possível deletar um produto inexistente no db.
13. Desenvolver testes para cobrir 30% de cada camada da aplicação:
13.1. Os testes da camada model devem mockar o db.
14. Criar um endpoint para deletar uma venda baseado no id da rota:
12.1. Deletar vendas através do caminho `/sales/:id`.
12.2. Não deve ser possível deletar uma venda inexistente no db.
15. Desenvolver testes para cobrir 35% de cada camada da aplicação:
15.1. Os testes da camada model devem mockar o db.
16. Criar um endpoint para atualizar uma venda baseado no id da rota:
10.1. Atualizar vendas através do caminho `/sales/:id`.
10.2. O corpo da requisição deve conter um array de objetos, onde cada objeto representa um produto.
10.3. Cada objeto possui as seguintes chaves: `productId` e `quantity`.
10.4. O corpo da requisição deve ser validado assim como no cadastro.
10.5. Não deve ser possível alterar uma venda que não existe no db.
17. Desenvolver testes para cobrir 40% de cada camada da aplicação:
17.1. Os testes da camada model devem mockar o db.
18. Criar um endpoint para buscar produtos baseados no queryTerm, se existirem.
18.1. Procurar produtos através do caminho `/products/search`.
18.2. Deve ser retornado um array de produtos que contenham em seu nome o termo passado na URL.
18.3. Caso nenhum produto seja encontrado, deve ser retornado um array vazio.
18.4. Se nenhum termo for passado, deve ser retornado um array contendo todos os produtos.
19. Desenvolver testes para cobrir 50% de cada camada da aplicação:
19.1. Os testes da camada model devem mockar o db.
20. Desenvolver testes para cobrir 60% de cada camada da aplicação:
20.1. Os testes da camada model devem mockar o db.
Arquivo de seed (seed.sql), migration (migration.sql), docker (Dockerfile) e docker compose (docker-compose.yml) fornecidos pela Trybe.