Este projeto tem como objetivo a criação de uma api REST com endpoints para a criação, leitura, manutenção e exclusão de estoques de lojas. A api conta com uma sessão de produtos da loja e sessão de vendas da loja também.
Fortaleci meu conhecimento sobre uma arquiterura mais limpa de código e de possibilidade de escalá-la, fortifiquei meu conhecimento sobre TypeScript e também utilizei pela primeira vez o Prisma ORM, o qual adaptei superfácil, sendo uma ótima opção além do sequelize. Meus desafios foram a organização do banco de dados, como torná-lo objetivo e como modelá-lo. Além disso, pensar na estruta geral do código e seus comportamentos foi uma tarefa árdua também para começar algo do zero.
Comando do docker para rodar o mysql:
docker run --name diventory -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
Clone o projeto
git clone [email protected]:dornellesfr/dinventory-backend.git
Entre no diretório do projeto
cd dinventory-backend
Instale as dependências
npm install
Inicie o servidor no ambiente de desenvolvimento
npm run dev
Para rodar esse projeto, você vai precisar adicionar as seguintes variáveis de ambiente no seu .env
MYSQL_URL
-> URL de acesso ao banco de dados
PORT
-> Porta que será executado no seu navegador em ambiente de desenvolvimento
SECRETJWT
-> palavra secreta para sua aplicação
A URL base da API, no momento, rodando em ambiente de produção é: https://diventory-api-production.up.railway.app/
Obrigatório. Este recurso permite fazer o login. Com o retorno esperado, haverá um token de autenticação para uso das próximas rotas.
Alguns recursos estão disponíveis apenas para admin. Você pode entrar em contato comigo caso queira testar ou saber mais sobre:
-
POST /
-> Faz o login retornando um token para autenticação.Rota livre para qualquer pessoa fazer login.
Parâmetros pelo body da requisição:
{ "email": "[email protected]", "password": "dattebayo" }
Retorna:
{ "token": "{tokenvalidandologin}" } * É válido por 5 dias cada token, você pode gerar o seu fazendo a mesma requisição com login e senha.
Este recurso permite a manipulação total das lojas cadastradas no banco de dados.
-
GET /
-> Faz a consulta para todas as lojas cadastradas.Essa rota só pode ser acessada com usuário admininistrador.
Retorna:
[ ... { "id": 3, "name": "Test Store", "password": "{encryptedpassword}", "admin": false, "email": "[email protected]", "address": null, "phone": null } ... ]
-
POST /
-> Cria uma loja no banco de dados.Essa rota só pode ser acessada com usuário admininistrador.
Parâmetros:
{ "email": "[email protected]", "name": "Test Store", "password": "dattebayo" }
Retorna:
{ "message": "Store created" }
-
PUT /
-> Atualiza a loja as características das lojas.Essa rota só pode ser acessada com usuário admininistrador.
Parâmetros:
{ "id": 3 }
O único obrigatório é esse, o restante é o que você gostaria de trocar, como: password, email, name, phone e address.
Retorno:
{ "message": "Store updated" }
-
DELETE /
-> Remove uma loja do banco de dados.Essa rota só pode ser acessada com usuário admininistrador.
Parâmetros:
{ "id": 3 }
Retorno:
{ "message": "Store removed" }
-
GET /
-> Faz a consulta de todos os produtos cadastrados.Essa rota só pode ser acessada com usuário admininistrador.
Retorno:
[ { "id": 1, "name": "Teclado mecânico", "description": "Teclado antighost com rgb", // nullable "price": 175.9, "quantity": 20, "storeId": 3 }, ... ]
-
POST /
-> Cadastra um novo produto na loja selecionada.Essa rota pode ser usada por qualquer usuário logado.
Parâmetros:
{ "name": "Mouse sem fio", "description": "Mouse óptico sem fio", "price": 50, "quantity": 10, "storeId": 3 }
Retorno:
{ "message": "Product created" }
-
PUT /
-> Altera um produto da loja selecionada.Essa rota pode ser usada por qualquer usuário logado.
Parâmetros:
{ "id": 1, "name": "Mouse gamer", "description": "Mouse óptico rgb", "price": 200, "quantity": 10, "storeId": 3 }
Retorno:
{ "message": "Product updated" }
-
DELETE /
-> Remove um produto da loja.Essa rota pode ser usada por qualquer usuário logado.
Parâmetros:
{ "id": 1 }
Retorno:
{ "message": "Store removed" }
-
GET /{id}
-> Mostra o produto em específico cadastrado.Essa rota pode ser usada por qualquer usuário logado.
Parâmetro:
id -> número do produto
Se id = 1
Retorno:
{ "id": 1, "name": "Teclado mecânico", "description": "Teclado antighost com rgb", // nullable "price": 175.9, "quantity": 20, "storeId": 3 },
-
GET /store/{storeId}
-> Mostra todos produtos cadastrados da loja.Essa rota pode ser usada por qualquer usuário logado.
Parâmetro:
storeId -> número da loja a qual se quer todos items
Retorno:
[ { "id": 1, "name": "Teclado mecânico", "description": "Teclado antighost com rgb", // nullable "price": 175.9, "quantity": 20, "storeId": 3 }, ... ]
-
GET /
-> Faz a consulta de todas as vendas cadastradas.Essa rota só pode ser acessada com usuário admininistrador.
Retorno:
[ { "id": 1, "date": "2023-05-08T14:42:32.382Z", "quantitySold": 1, "totalValue": 200, "productId": 1, "storeId": 3 } ]
-
POST /
-> Cadastra uma nova venda na loja selecionada.Essa rota pode ser usada por qualquer usuário logado.
Parâmetros:
{ "quantitySold": 1, "totalValue": 200, "productId": 1, "storeId": 3 }
Retorno:
{ "message": "Sale created successfully" }
-
PUT /
-> Altera uma venda da loja selecionada.Essa rota pode ser usada por qualquer usuário logado.
Parâmetros:
{ "id": 1, "quantitySold": 2, "totalValue": 200, "productId": 1, "storeId": 3 }
Retorno:
{ "message": "Sale updated successfully" }
-
DELETE /
-> Remove uma venda da loja.Essa rota pode ser usada por qualquer usuário logado.
Parâmetros:
{ "id": 1 }
Retorno:
{ "message": "Sale removed successfully" }
-
GET /{id}
-> Mostra uma venda em específica cadastrada.Essa rota pode ser usada por qualquer usuário logado.
Parâmetro:
id da venda
Se id = 1
Retorno:
{ "id": 1, "date": "2023-05-08T14:42:32.382Z", "quantitySold": 2, "totalValue": 200, "productId": 1, "storeId": 3 }
-
GET /store/{storeId}
-> Mostra todas as vendas cadastradas da loja.Essa rota pode ser usada por qualquer usuário logado.
Parâmetro:
storeId -> número da loja a qual se quer todos items
Retorno:
[ { "id": 1, "date": "2023-05-08T14:42:32.382Z", "quantitySold": 2, "totalValue": 200, "productId": 1, "storeId": 3, "product": { "id": 1, "name": "Mouse gamer", "description": "Mouse óptico rgb", "price": 200, "quantity": 5, "storeId": 3 } } ... ]
Back-end: Node, Express, TypeScript, Prisma e MySQL