Rotas abertas:
- POST /signUp --- Criação de usuário na DB.
- POST /auth/login --- Login do usuário, este que receberá um retorno: token(JWT).
Rotas autenticadas:
- GET /category --- Recebimento de todas categorias disponíveis na DB
- GET /product --- Recebimendo de todos produtos disponíveis na DB
- GET /product/:id --- Recebimendo do produto de acordo com o Id na DB
- POST /product --- Criação de um produto na DB
- PATCH /product/:id --- Atualização de um produto na DB
- DELETE /product/:id --- Remoção de um produto na DB
Principais tecnologias/bibliotecas/frameworks:
- Typescript - Para tipagem estática, interfaces e classes. Em outras palavras, para maior segurança e previsibilidade.
- Bcrypt - Criptografia para armazenar senhas com segurança usando funções hash e salt.
- Node - Um ótimo ambiente de tempo de execução para criar aplicativos do lado do servidor escaláveis e eficientes com JS.
- joi - É uma biblioteca de validação de dados que facilita a leitura do código e evita a adição de erros ou bugs no banco de dados.
- JWT - Para autenticação de usuário segura e escalável.
- MongoDB - Flexibilidade de esquema e suporte para operações em tempo real em dados não estruturados e semi-estruturados.
- Mongoose - Solução direta e baseada em esquemas para modelagem de dados de aplicativos.
- No diretório aonde está o dump (Menu---API), abra o terminal.
- Digite o seguinte comando:
mongorestore --db Menu dump/Menu
- Clone este repositório.
- Instale todas as dependências.
npm i
-
Configure o arquivo
.env
usando o.env.example
. -
Se houver nescessidade de criação da
dist
, utilize:npx tsc
-
Inicie o servidor
mongo
, por exemplo:mongod --dbpath ~/.mongo
-
Execute o back-end em um ambiente de desenvolvimento:
npm run watch, npm run redist ou npm run dev(caso tenha a pasta dist)
- No diretório aonde está o dump (Menu---API), abra o terminal.
- Digite o seguinte comando:
mongorestore --db Menu-test dump/Menu-test
-
Configure o arquivo
.env.test
usando o.env.example
. -
Execute os testes em um ambiente de desenvolvimento:
npm run test
- Database name utilizada foi
Menu
, está pode ser definida e alterada no.env
- Foi divida em 3 collections, caso nescessário poderiam ser mais (como a que pode armazenar token do user criptografado):
collections:
- users
_id: 6431d9b9e726c78255caaf45
email: exemple@testemail.com
password: 123123
- categories
_id: alcoolicas
parent: bebidas
name: Bebidas Alcoólicas
- products
_id: "642fc0da7e293a2cce660615"
categories: [{
"_id": "alcoolicas",
"parent": "bebidas",
"name": "Bebidas Alcoólicas"
}]
name: Vinho Seco
qty: 30
price: 20.4
POST /signUp
- Envio
{
"email": "admin@gmail.com",
"password": "admin12"
}
- Retorno
{
"user": "User \"admin@gmail.com\" created!"
}
POST /auth/login
- Envio
{
"email": "admin@gmail.com",
"password": "admin12"
}
- Retorno
Em formato Bearer Token, deve ser enviado no header. Tem duração de 1h.
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NDMyZjZjOTI2ZTIyMDI4OTM3MzhhNGEiLCJpYXQiOjE2ODEwNjI5NzksImV4cCI6MTY4MTA2NjU3OX0.bHQZRoDiOYY-6h_IvMGmtdVYuNtzyRGMXNGBTisKHnk"
}
GET /category
- Retorno
[
{
"_id": "bebidas",
"parent": null,
"name": "Bebidas"
},
{
"_id": "alcoolicas",
"parent": "bebidas",
"name": "Bebidas Alcoólicas"
},
{
"_id": "nao-alcoolicas",
"parent": "bebidas",
"name": "Bebidas Não Alcoólicas"
},
{
"_id": "comidas",
"parent": null,
"name": "Comidas"
}
]
GET /product
- Retorno
{
"_id": "642fc0da7e293a2cce660615",
"categories": [
[
{
"_id": "comidas",
"parent": null,
"name": "Comidas"
}
]
],
"name": "Vinho Seco",
"qty": 30,
"price": 20.4,
"__v": 0
},
{
"_id": "64307f885b2e3e38560351da",
"categories": [
[
{
"_id": "comidas",
"parent": null,
"name": "Comidas"
}
]
],
"name": "Vinho Tinto",
"qty": 40,
"price": 40.4,
"__v": 0
},
{
"_id": "64308040d0ce999029ae3774",
"categories": [
[
{
"_id": "comidas",
"parent": null,
"name": "Comidas"
}
]
],
"name": "Pizza",
"qty": 16,
"price": 10,
"__v": 0
}
GET /product/:id
- Retorno
{
"_id": "642fc0da7e293a2cce660615",
"categories": [
[
{
"_id": "comidas",
"parent": null,
"name": "Comidas"
}
]
],
"name": "Vinho Seco",
"qty": 30,
"price": 20.4,
"__v": 0
}
POST /product
- Envio
{
"categories": [
{
"_id": "alcoolicas",
"parent": "bebidas",
"name": "Bebidas Alcoólicas"
}
],
"name": "Vinho de Cereja",
"qty": 30,
"price": 20.40
}
- Retorno
{
"categories": [
[
{
"_id": "alcoolicas",
"parent": "bebidas",
"name": "Bebidas Alcoólicas"
}
]
],
"name": "Vinho de Cereja",
"qty": 30,
"price": 20.4,
"_id": "6432ff9d69884021ee295254",
"__v": 0
}
PATCH /product/:id
O envio de PATCH é bem diverso. Um campo não depende do outro para ser atualizado, sendo assim, você pode enviar apenas o "price", "qty", "categories", "categories.name", "name" e afins, por exemplo, e assim a estrutura será atualizada! Cada estrutura de atualização é independente!
- Original
{
"_id": "642fc0da7e293a2cce660615",
"categories": [
[
{
"_id": "comidas",
"parent": null,
"name": "Comidas"
}
]
],
"name": "Vinho Seco",
"qty": 30,
"price": 20.4,
"__v": 0
}
- Envio
{
"categories": [
{
"_id": "nao-alcoolicas",
"parent": "bebidas",
"name": "Bebidas Não Alcoólicas"
}
],
"name": "Água mineral"
}
- Retorno
{
"_id": "642fc0da7e293a2cce660615",
"categories": [
[
{
"_id": "nao-alcoolicas",
"parent": "bebidas",
"name": "Bebidas Não Alcoólicas"
}
]
],
"name": "Água mineral",
"qty": 30,
"price": 20.4,
"__v": 0
}
DELETE /product/:id
- Retorno
{
"deletedCount": "Product with id 642fc0da7e293a2cce660615 has been deleted"
}