Simples aplicação composta por três microsserviços para exemplificar um backend de um e-commerce.
- Products API: CRUD de produtos (Node.js + AdonisJS + MySQL)
- Orders API: Gerenciamento de pedidos (Node.js + Express + MySQL)
- Shipping Calculator: Cálculo de frete (PHP)
Base URL: http://localhost:8001
Tecnologia: Node.js + AdonisJS 4.1.0
GET /products
Resposta de Sucesso (200):
[
{
"id": 1,
"name": "Arroz",
"quantity": 100,
"price": 19.99,
"weight": 1,
"created_at": "2025-12-02T10:00:00.000Z",
"updated_at": "2025-12-02T10:00:00.000Z"
}
]POST /products
Body:
{
"name": "Macarrão",
"quantity": 60,
"price": 5.99,
"weight": 0.5
}Resposta de Sucesso (201):
{
"id": 21,
"name": "Macarrão",
"quantity": 60,
"price": 5.99,
"weight": 0.5,
"created_at": "2025-12-02T10:00:00.000Z",
"updated_at": "2025-12-02T10:00:00.000Z"
}GET /products/:id
Parâmetros:
id(obrigatório): ID do produto
Resposta de Sucesso (200):
{
"id": 1,
"name": "Arroz",
"quantity": 100,
"price": 19.99,
"weight": 1,
"created_at": "2025-12-02T10:00:00.000Z",
"updated_at": "2025-12-02T10:00:00.000Z"
}Resposta de Erro (404):
{
"data": "Resource not found"
}PUT /products/:id
Parâmetros:
id(obrigatório): ID do produto
Body:
{
"name": "Feijão",
"quantity": 80,
"price": 12.49,
"weight": 2
}Resposta de Sucesso (200):
{
"id": 1,
"name": "Feijão",
"quantity": 80,
"price": 12.49,
"weight": 2,
"created_at": "2025-12-02T10:00:00.000Z",
"updated_at": "2025-12-02T10:30:00.000Z"
}Resposta de Erro (404):
{
"data": "Resource not found"
}DELETE /products/:id
Parâmetros:
id(obrigatório): ID do produto
Resposta de Sucesso (204): Sem conteúdo
Resposta de Erro (404):
{
"data": "Resource not found"
}Base URL: http://localhost:8002
Tecnologia: Node.js + Express
POST /orders
Body:
{
"product_id": 1,
"quantity": 2
}Descrição: Cria um novo pedido, verifica o estoque disponível, calcula o frete através do serviço de Shipping Calculator e atualiza o estoque do produto.
Resposta de Sucesso (201):
{
"order_id": 1,
"product_id": 1,
"quantity": 2,
"total_price": 39.98,
"shipping_cost": "13.50",
"delivery_time": 3
}Resposta de Erro (400) - Estoque insuficiente:
Quantidade de produto insuficiente.
Resposta de Erro (500) - Erro ao processar:
Erro ao processar o pedido: [mensagem de erro]
Regras de Negócio:
- O produto deve existir no banco de dados
- A quantidade solicitada deve estar disponível em estoque
- O estoque é decrementado automaticamente após a criação do pedido
- O cálculo de frete é feito automaticamente com base no peso e quantidade
- Toda a operação é realizada em uma transação (rollback em caso de erro)
Base URL: http://localhost:8003
Tecnologia: PHP 8.3
POST /
Body:
{
"quantity": 5,
"weight": 10.5
}Descrição: Calcula o custo e tempo de entrega baseado na quantidade e peso total.
Resposta de Sucesso (200):
{
"cost": "33.90",
"delivery_time": 5
}Resposta de Erro (400):
{
"error": "Both quantity and weight are required."
}ou
{
"error": "Invalid input: -5. It must be a positive number."
}Fórmula de Cálculo:
- Custo:
5.00 (base) + (weight × 2.00) + (quantity × 1.50) - Tempo de Entrega:
2 (dias base) + ceil(weight / 5) + ceil(quantity / 10)
Validações:
quantityeweightsão obrigatóriosquantityeweightdevem ser números positivos maiores que zero
- Cliente consulta produtos disponíveis:
GET /products - Cliente seleciona um produto e quantidade
- Cliente cria um pedido:
POST /orders - Sistema verifica estoque disponível
- Sistema calcula frete (chamada interna para Shipping Calculator)
- Sistema cria o pedido e atualiza o estoque
- Sistema retorna confirmação com detalhes do pedido
No diretório raiz do projeto execute o comando 'docker-compose build':
docker-compose build
Após fazer o build, use o comando 'docker-compose up' para iniciar os containers:
docker-compose up
Observação: Na primeira execução, o MySQL irá criar automaticamente as tabelas e popular os dados de produtos. Não é necessário executar os scripts manualmente.
O banco de dados é inicializado automaticamente na primeira execução do docker-compose. Os seguintes scripts são executados em ordem:
database/scripts/tables.sql- Cria as tabelas (products, orders, order_items)database/scripts/products_insert.sql- Insere 20 produtos de exemplo
Se precisar recriar o banco de dados do zero, remova o volume e reinicie os containers:
docker-compose down -v
docker-compose updocker exec -it products_api bash
node ace test
docker exec -it orders_api bash
npx mocha app.spec.js
docker exec -it shipping_calculator_service bash
php test_shipping_calculator.php