Skip to content

efrj/simple-commerce-node.js-php

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple Commerce

Simples aplicação composta por três microsserviços para exemplificar um backend de um e-commerce.

Arquitetura

  • 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)

Documentação das APIs

Products API

Base URL: http://localhost:8001

Tecnologia: Node.js + AdonisJS 4.1.0

Endpoints

1. Listar todos os produtos
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"
  }
]
2. Criar um produto
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"
}
3. Buscar um produto por ID
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"
}
4. Atualizar um produto
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"
}
5. Deletar um produto
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"
}

Orders API

Base URL: http://localhost:8002

Tecnologia: Node.js + Express

Endpoints

1. Criar um pedido
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)

Shipping Calculator API

Base URL: http://localhost:8003

Tecnologia: PHP 8.3

Endpoints

1. Calcular frete
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:

  • quantity e weight são obrigatórios
  • quantity e weight devem ser números positivos maiores que zero

Fluxo Completo de um Pedido

  1. Cliente consulta produtos disponíveis: GET /products
  2. Cliente seleciona um produto e quantidade
  3. Cliente cria um pedido: POST /orders
  4. Sistema verifica estoque disponível
  5. Sistema calcula frete (chamada interna para Shipping Calculator)
  6. Sistema cria o pedido e atualiza o estoque
  7. Sistema retorna confirmação com detalhes do pedido

Rodando o projeto com o Docker

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.

Banco de Dados

O banco de dados é inicializado automaticamente na primeira execução do docker-compose. Os seguintes scripts são executados em ordem:

  1. database/scripts/tables.sql - Cria as tabelas (products, orders, order_items)
  2. 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 up

Rodando os Unit Tests

Products

Entre no container

docker exec -it products_api bash

Execute o comando para rodar o teste

node ace test

Orders

Entre no container

docker exec -it orders_api bash

Execute o comando para rodar o teste

npx mocha app.spec.js

Shipping Calculator

Entre no container

docker exec -it shipping_calculator_service bash

Execute o comando para rodar o teste

php test_shipping_calculator.php

About

Simples aplicação composta por três microsserviços para exemplificar um backend de um e-commerce.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published