Sistema compuesto por dos APIs REST (Customers y Orders) y un Lambda orquestador para gestionar pedidos B2B. Las APIs se comunican entre sí, validan clientes, gestionan inventario y procesan órdenes con confirmación idempotente.
- Backend: Node.js 22.x + Express.js
- Base de Datos: MySQL 8.0
- Contenerización: Docker + Docker Compose
- Serverless: AWS Lambda (Serverless Framework)
- Autenticación: JWT + Service Tokens
- Validación: Joi
- Documentación: OpenAPI 3.0
- Docker y Docker Compose instalados
- Node.js 22.x y NPM
- Git
b2b-orders-system/
├── customers-api/ # API de gestión de clientes
├── orders-api/ # API de productos y órdenes
├── lambda-orchestrator/ # Función Lambda orquestadora
├── db/ # Scripts SQL (schema + seed)
├── docker-compose.yml
└── README.md
git clone <repository-url>
cd b2b-orders-systemCopia los archivos .env.example y renómbralos a .env en cada servicio:
customers-api/.env
PORT=3001
DB_HOST=db
DB_PORT=3306
DB_USER=root
DB_PASSWORD=root
DB_NAME=b2b_orders
JWT_SECRET=dev-jwt-secret-key
SERVICE_TOKEN=dev-internal-service-token-123orders-api/.env
PORT=3002
DB_HOST=db
DB_PORT=3306
DB_USER=root
DB_PASSWORD=root
DB_NAME=b2b_orders
JWT_SECRET=dev-jwt-secret-key
SERVICE_TOKEN=dev-internal-service-token-123
CUSTOMERS_API_BASE=http://customers-api:3001/apilambda-orchestrator/.env
CUSTOMERS_API_BASE=http://localhost:3001/api
ORDERS_API_BASE=http://localhost:3002/api
SERVICE_TOKEN=dev-internal-service-token-123docker-compose up -d --buildEste comando:
- Construye las imágenes de las APIs
- Levanta MySQL y ejecuta schema.sql y seed.sql
- Inicia customers-api en puerto 3001
- Inicia orders-api en puerto 3002
curl http://localhost:3001/health
curl http://localhost:3002/healthAmbas deben responder: {"status": "ok"}
cd lambda-orchestrator
npm install
npm run devEl Lambda estará disponible en: http://localhost:3003/dev/orchestrator/create-and-confirm-order
- Customers API:
http://localhost:3001/api - Orders API:
http://localhost:3002/api - Lambda Orchestrator:
http://localhost:3003/dev
Consulta los archivos OpenAPI para detalles completos:
customers-api/openapi.yamlorders-api/openapi.yaml
Customers API
POST /customers- Crear clienteGET /customers/:id- Obtener clienteGET /customers?search=&cursor=&limit=- Búsqueda paginada
Orders API
POST /products- Crear productoGET /products/:id- Obtener productoPATCH /products/:id- Actualizar precio/stockPOST /orders- Crear ordenPOST /orders/:id/confirm- Confirmar orden (idempotente)POST /orders/:id/cancel- Cancelar orden
curl -X POST http://localhost:3003/dev/orchestrator/create-and-confirm-order \
-H "Content-Type: application/json" \
-d '{
"customer_id": 1,
"items": [
{
"product_id": 2,
"qty": 3
}
],
"idempotency_key": "unique-key-123",
"correlation_id": "req-789"
}'{
"success": true,
"correlationId": "req-789",
"data": {
"customer": {
"id": 1,
"name": "ACME Corporation",
"email": "ops@acme.com",
"phone": "+1-555-0101"
},
"order": {
"id": 101,
"status": "CONFIRMED",
"total_cents": 389700,
"items": [
{
"product_id": 2,
"qty": 3,
"unit_price_cents": 129900,
"subtotal_cents": 389700
}
]
}
}
}Para facilitar las pruebas, se incluyen colecciones de Postman para cada API. Puedes importarlas directamente en tu cliente Postman.
- Ubicación:
/postman_collections - Archivos:
Customers_API.postman_collection.jsonOrders_API.postman_collection.json
docker-compose downPara eliminar los volúmenes de datos:
docker-compose down -v- Idempotencia: La confirmación de órdenes usa
X-Idempotency-Keypara prevenir duplicados - Transacciones: Creación y cancelación de órdenes usan transacciones SQL
- Autenticación Inter-Servicios: Las APIs se comunican usando
SERVICE_TOKEN - Paginación: Implementada con cursor-based pagination
- Race Conditions: Prevenidas usando
SELECT ... FOR UPDATE
cd lambda-orchestrator
serverless deployConfigurar variables de entorno en AWS Lambda Console con las URLs públicas de las APIs.