Orderfy é uma simples API RESTful para gerenciamento de pedidos, desenvolvida em Node.js com Express e PostgreSQL.
- JavaScript
- Node.js
- Express
- PostgreSQL
- Docker
- JWT
É necessário ter as seguintes ferramentas instaladas:
Depois de instalar as ferramentas, execute os seguintes comandos:
# Copiar o arquivo exemplo de variáveis de ambiente e renomear para .env
cp .env.example .env
# Instalar dependências
npm install
# Buildar a imagem Docker e o banco de dados PostgreSQL (Precisa do Docker Desktop)
npm run docker
# Ou buildar diretamente, caso prefira
docker compose up -d
# Iniciar o servidor
npm run devApós isso, a API estará disponível em http://localhost:3000.
OBS: Se já tiver o PostgreSQL instalado, basta criar o banco de dados 'orderfy' com as credenciais do arquivo .env e executar o npm run dev, criando as tabelas automaticamente.
Abaixo é possível ver todos os endpoints disponíveis na API.
Para poder testar sem copiar os curls manualmente, siga o passo a passo a seguir:
O repositório inclui uma collection do Postman pronta para uso. Baixe o arquivo (orderfy-api.postman_collection.json) e importe-o no Postman.
Para importar o arquivo:
- Abra o Postman
- Clique em Import
- Selecione o arquivo
orderfy-api.postman_collection.json - Acesse a collection importada, escolha o endpoint desejado e clique em Send
Com isso, você pode testar os endpoints diretamente no Postman de maneira simplificada.
A API utiliza uma autenticação via JWT (JSON Web Token). Todos os endpoints de pedidos exigem um token válido no header Authorization para evitar acesso não autorizado.
Para autenticar, siga o passo a passo a seguir:
- Registre um usuário em
POST /auth/register - Faça login em
POST /auth/login
Ao usar a collection do Postman, o token é salvo automaticamente na variável {{token}} após o login e enviado em todas as requisições de pedidos sem nenhuma configuração adicional.
Caso esteja testando via curl, envie o token manualmente no header:
Authorization: Bearer <token>
OBS: O token tem uma validade de 24 horas.
Registrar usuário.
Request body:
{
"username": "admin",
"password": "admin123"
}curl:
curl --location 'http://localhost:3000/auth/register' \
--request POST \
--header 'Content-Type: application/json' \
--data '{
"username": "admin",
"password": "admin123"
}'Response 201 Created:
{
"id": 1,
"username": "admin"
}Login.
Request body:
{
"username": "admin",
"password": "admin123"
}curl:
curl --location 'http://localhost:3000/auth/login' \
--request POST \
--header 'Content-Type: application/json' \
--data '{
"username": "admin",
"password": "admin123"
}'Response 200 OK:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}Criar pedido.
Request body:
{
"numeroPedido": "v10089015vdb-01",
"valorTotal": 10000,
"dataCriacao": "2023-07-19T12:24:11.5299601+00:00",
"items": [
{
"idItem": "2434",
"quantidadeItem": 1,
"valorItem": 1000
}
]
}curl:
curl --location 'http://localhost:3000/order' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <token>' \
--data '{
"numeroPedido": "v10089015vdb-01",
"valorTotal": 10000,
"dataCriacao": "2023-07-19T12:24:11.5299601+00:00",
"items": [
{
"idItem": "2434",
"quantidadeItem": 1,
"valorItem": 1000
}
]
}'Response 201 Created:
{
"orderId": "v10089015vdb-01",
"value": "10000.00",
"creationDate": "2023-07-19T12:24:11.530Z",
"items": [
{
"id": 1,
"orderId": "v10089015vdb-01",
"productId": 2434,
"quantity": 1,
"price": "1000.00"
}
]
}Buscar pedido por ID.
curl:
curl --location 'http://localhost:3000/order/v10089015vdb-01' \
--request GET \
--header 'Authorization: Bearer <token>'Response 200 OK:
{
"orderId": "v10089015vdb-01",
"value": "10000.00",
"creationDate": "2023-07-19T12:24:11.530Z",
"items": [
{
"id": 1,
"orderId": "v10089015vdb-01",
"productId": 2434,
"quantity": 1,
"price": "1000.00"
}
]
}Listar todos os pedidos.
curl:
curl --location 'http://localhost:3000/order/list' \
--request GET \
--header 'Authorization: Bearer <token>'Response 200 OK:
[
{
"orderId": "v10089015vdb-01",
"value": "10000.00",
"creationDate": "2023-07-19T12:24:11.530Z",
"items": [
{
"id": 1,
"orderId": "v10089015vdb-01",
"productId": 2434,
"quantity": 1,
"price": "1000.00"
}
]
}
]Atualizar pedido.
curl:
curl --location 'http://localhost:3000/order/v10089015vdb-01' \
--request PUT \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <token>' \
--data '{
"valorTotal": 20000,
"dataCriacao": "2023-07-20T09:00:00.000+00:00",
"items": [
{
"idItem": "2434",
"quantidadeItem": 2,
"valorItem": 10000
}
]
}'Response 200 OK:
{
"orderId": "v10089015vdb-01",
"value": "20000.00",
"creationDate": "2023-07-20T09:00:00.000Z",
"items": [
{
"id": 2,
"orderId": "v10089015vdb-01",
"productId": 2434,
"quantity": 2,
"price": "10000.00"
}
]
}Deletar pedido.
curl:
curl --location 'http://localhost:3000/order/v10089015vdb-01' \
--request DELETE \
--header 'Authorization: Bearer <token>'Response 200 OK:
{
"message": "Order 'v10089015vdb-01' deleted successfully."
}| Status | Descrição |
|---|---|
400 Bad Request |
Campos obrigatórios ausentes ou incorretos |
401 Unauthorized |
Token ausente ou incorreto |
404 Not Found |
Pedido não encontrado |
409 Conflict |
Já existe um pedido ou usuário com esse ID |
500 Internal Server Error |
Erro interno no servidor |
Exemplo 401:
{
"error": "Access denied. No token provided."
}Exemplo 404:
{
"error": "Order 'v10089015vdb-01' not found."
}orderfy-api/
├── src/
│ ├── controllers/
│ │ ├── auth.controller.js # Handlers de registro e login
│ │ └── order.controller.js # Handlers e mapping dos campos
│ ├── database/
│ │ └── migrations.js # Criação das tabelas no banco
│ ├── middleware/
│ │ └── auth.middleware.js # Validação do token JWT
│ ├── models/
│ │ ├── user.model.js # Queries SQL de usuários
│ │ └── order.model.js # Queries SQL de pedidos
│ ├── routes/
│ │ ├── auth.routes.js # Rotas de autenticação
│ │ └── order.routes.js # Rotas de pedidos
│ └── db.js # Pool de conexão com o PostgreSQL
├── .env # Variáveis de ambiente
├── docker-compose.yml # Imagem Docker do Projeto e do PostgreSQL
└── index.js # Arquivo principal da aplicação
A API recebe os dados e faz o mapping necessário para salvar as informações no banco de dados, como no exemplo a baixo:
| Recebido | Salvo no banco |
|---|---|
numeroPedido |
orderId |
valorTotal |
value |
dataCriacao |
creationDate |
idItem |
productId |
quantidadeItem |
quantity |
valorItem |
price |