Un proyecto educativo completo para aprender Command Query Responsibility Segregation (CQRS) con Node.js, TypeScript, MongoDB y SQLite.
CQRS es un patrón arquitectónico que separa las operaciones de lectura (Queries) de las operaciones de escritura (Commands). Este proyecto implementa una arquitectura CQRS completa con:
- Commands: Operaciones que modifican el estado del sistema
- Queries: Operaciones que obtienen datos sin modificar el estado
- Events: Notificaciones de cambios que han ocurrido
- Event Handlers: Manejadores que reaccionan a los eventos
- Message Bus: Sistema de mensajería para coordinar commands, queries y events
src/
├── api/ # Capa de presentación (REST API)
├── modules/
│ ├── users/ # Módulo de usuarios (IMPLEMENTADO)
│ │ ├── application/ # Casos de uso, commands, queries
│ │ ├── domain/ # Entidades y reglas de negocio
│ │ └── infrastructure/# Persistencia y servicios externos
│ └── orders/ # Módulo de pedidos (🚧 PENDIENTE)
├── shared/ # Código compartido (interfaces, base classes)
└── bootstrap/ # Configuración e inyección de dependencias
- Node.js + TypeScript - Runtime y lenguaje
- Express.js - Framework web
- MongoDB - Base de datos de lectura (Read Model)
- SQLite - Base de datos de escritura (Write Model)
- Zod - Validación de esquemas
- Docker - Contenedorización
- Node.js 18+
- Docker y Docker Compose
- Clonar el repositorio:
git clone https://github.com/mvrcoag/nodejs-cqrs
cd nodejs-cqrs- Instalar dependencias:
npm install- Iniciar servicios con Docker:
docker-compose up -d- Compilar el proyecto:
npm run build- Iniciar el servidor:
npm startEl servidor estará disponible en http://localhost:3000
GET /health- Estado del sistema y cola de eventos
POST /api/users- Registrar nuevo usuarioPUT /api/users/:id- Actualizar usuario existenteGET /api/users- Obtener todos los usuariosGET /api/users/:id- Obtener usuario por ID
# Crear usuario
curl -X POST http://localhost:3000/api/users \
-H "Content-Type: application/json" \
-d '{"name": "Juan Pérez", "email": "juan@example.com"}'
# Obtener usuarios
curl http://localhost:3000/api/users- Write Model (SQLite): Almacena commands y events
- Read Model (MongoDB): Almacena vistas optimizadas para queries
RegisterUserCommand- Registrar usuarioUpdateUserCommand- Actualizar usuario
GetAllUsersQuery- Obtener todos los usuariosFindUserQuery- Buscar usuario específico
UserRegisteredEvent- Usuario registradoUserUpdatedEvent- Usuario actualizado
- Sistema de mensajería in-memory
- Cola de eventos asíncrona
- Manejo de errores y reintentos
El módulo orders/ está estructurado pero no implementado. ¡Esta es tu oportunidad perfecta para practicar CQRS!
CreateOrderCommand- Crear nueva ordenAddOrderItemCommand- Agregar item a ordenUpdateOrderStatusCommand- Cambiar estado de ordenCancelOrderCommand- Cancelar orden
GetOrderQuery- Obtener orden por IDGetOrdersByUserQuery- Obtener órdenes de un usuarioGetOrdersByStatusQuery- Filtrar por estado
OrderCreatedEvent- Orden creadaOrderItemAddedEvent- Item agregadoOrderStatusChangedEvent- Estado cambiadoOrderCancelledEvent- Orden cancelada
// Ejemplos de estructuras sugeridas
interface Order {
id: string
userId: string
items: OrderItem[]
status: OrderStatus
total: number
createdAt: Date
}
interface OrderItem {
productId: string
quantity: number
unitPrice: number
total: number
}
enum OrderStatus {
PENDING = 'pending',
CONFIRMED = 'confirmed',
SHIPPED = 'shipped',
DELIVERED = 'delivered',
CANCELLED = 'cancelled'
}- Implementa los Commands y Handlers
- Crea las Queries y sus Handlers
- Define los Events y Event Handlers
- Agrega los endpoints REST en el API
- Implementa los repositorios (Write y Read)
- Estudia el módulo
users/como referencia - Sigue los mismos patrones y estructura
- Los interfaces base están en
shared/domain/ - El Message Bus ya está configurado y listo para usar
npm run build- Compilar TypeScriptnpm start- Iniciar servidornpm run typecheck- Verificar tipos
Este es un proyecto educativo. ¡Las contribuciones y mejoras son bienvenidas!
- Fork el proyecto
- Crea tu rama de feature (
git checkout -b feature/orders-module) - Implementa el módulo orders siguiendo los patrones CQRS
- Commit tus cambios (
git commit -m 'Add: Complete orders module') - Push a la rama (
git push origin feature/orders-module) - Abre un Pull Request
Al completar este proyecto aprenderás:
- ✅ Patrón CQRS - Separación de commands y queries
- ✅ Events - Manejo de eventos de dominio
- ✅ Domain Driven Design - Modelado del dominio
- ✅ Clean Architecture - Separación en capas
- ✅ TypeScript avanzado - Tipos, interfaces y generics
- ✅ Bases de datos duales - Write/Read models
- ✅ Message Bus - Patrones de mensajería
- ✅ Inyección de dependencias - Inversión de control
Este proyecto es de uso educativo. Siéntete libre de usar, modificar y aprender de él.
¡Empieza implementando el módulo Orders y conviértete en un experto en CQRS! 🚀
¿Tienes preguntas? ¡Abre un issue y hablemos sobre CQRS y arquitectura de software!
