Backend del sistema de gestión de taller usando NestJS + TypeScript con arquitectura hexagonal (Clean Architecture + Ports & Adapters).
src/
domain/ # Lógica pura de negocio
entities/ # Entidades del dominio
value-objects/ # Value Objects (Decimal, Email)
services/ # Servicios de dominio (sin dependencias de NestJS)
application/ # Capa de aplicación
ports/ # Interfaces/contratos
use-cases/ # Casos de uso orquestadores
infrastructure/ # Implementaciones concretas
persistence/ # Repositorios (adaptadores de datos)
typeorm/entities/
typeorm/repositories/
http/ # Controllers, DTOs (adaptadores HTTP)
controllers/
dto/
auth/ # JWT, Guards, Estrategias
schedulers/ # Cron jobs
config/ # Configuración centralizada
app.module.ts # Módulo raíz
main.ts # Punto de entrada
- ✅ Hexagonal Architecture: Separación clara de responsabilidades
- ✅ Domain-Driven Design: Lógica pura en la capa de dominio
- ✅ TypeScript Strict:
noImplicitAny,strictNullChecks, etc. - ✅ PostgreSQL + TypeORM: Base de datos relacional
- ✅ JWT Authentication: Con roles y guards
- ✅ CORS Configurable: Orígenes desde
.env - ✅ Security Headers: X-Robots-Tag, X-Frame-Options, etc.
- ✅ Cron Schedulers: Tareas automáticas (@nestjs/schedule)
- ✅ Class Validation: DTOs validados con class-validator
- ✅ Value Objects: Decimal con precisión, Email validado
Crear archivo .env en la raíz del proyecto:
NODE_ENV=development
PORT=3002
DATABASE_URL=postgresql://usuario:contraseña@localhost:5432/taller_db
JWT_SECRET=tu-secret-key-minimo-32-caracteres-aqui!
JWT_EXPIRATION=24h
FRONTEND_ORIGINS=http://localhost:3000pnpm installCREATE DATABASE taller_db;Desarrollo (con hot-reload):
pnpm devProducción:
pnpm build
pnpm start:prodadmin: Control totalowner: Solo lectura de reportesmechanic: Registrar serviciosrecepcion: Registrar clientes, vehículos y ventas
- Tipo: ACEITE, FILTRO, OTRO
- Margen de ganancia configurable
- Precio calculado automáticamente
- Control de stock
- Registro con km y descripción
- Detalles de productos usados
- Cálculo automático de costo
- Generación de recordatorio (km/fecha)
- Sin vehículo asociado
- Mismo control de stock que servicios
- Movimientos kardex automáticos
- Cambio de aceite automático
- Determinación: ocurre primero (km o fecha)
- Notificaciones pendientes
POST /auth/login- Obtener token JWTGET /auth/me- Perfil actual
GET /clientes- Listar todosGET /clientes/:id- Obtener por IDPOST /clientes- Crear (admin, recepcion)PATCH /clientes/:id- ActualizarDELETE /clientes/:id- Eliminar (admin)
GET /vehiculos- ListarGET /vehiculos/:id- ObtenerPOST /vehiculos- CrearPATCH /vehiculos/:id- ActualizarDELETE /vehiculos/:id- Eliminar
GET /productos- ListarGET /productos/:id- ObtenerPOST /productos- Crear (admin)PATCH /productos/:id- Actualizar (admin)DELETE /productos/:id- Eliminar (admin)
GET /servicios- ListarGET /servicios/:id- ObtenerPOST /servicios- Registrar (mechanic, admin)PATCH /servicios/:id/completar- CompletarDELETE /servicios/:id- Eliminar (admin)
GET /ventas- ListarGET /ventas/:id- ObtenerPOST /ventas- Registrar (recepcion, admin)DELETE /ventas/:id- Eliminar (admin)
GET /inventario/kardex/:productoId- Historial movimientosGET /inventario/productos/estado- Estado actual stock
GET /recordatorios- ListarGET /recordatorios/pendientes- Solo pendientesGET /recordatorios/:id- ObtenerPATCH /recordatorios/:id/completar- Marcar completadoDELETE /recordatorios/:id- Eliminar
- JWT Bearer Token en header
Authorization - RolesGuard protegiendo endpoints
- Headers de seguridad automáticos
- Validación de DTOs (class-validator)
- Strict TypeScript mode
- No uso de
anytype
# Desarrollo
pnpm dev
# Build
pnpm build
# Formatear código
pnpm format
# Linting
pnpm lint
# Ejecutar en producción
pnpm start:prod
# Migraciones TypeORM (cuando tengas migrations)
pnpm typeorm:migration:generate
pnpm typeorm:migration:run@nestjs/common@^10.4.0- NestJS core@nestjs/typeorm@^10.1.0- TypeORM integration@nestjs/jwt@^12.0.0- JWT auth@nestjs/schedule@^4.1.0- Cron jobspassport-jwt@^4.0.1- JWT strategyclass-validator@^0.14.1- DTO validationclass-transformer@^0.5.1- DTO transformationpg@^8.12.0- PostgreSQL driverpdfkit@^0.14.0- PDF generationtypeorm@^0.3.21- ORM
- Los Value Objects validan en construcción
- Los repositorios mapean entre TypeORM y Domain
- Los Use Cases orquestan la lógica sin lógica de negocio duplicada
- Los Controllers no contienen lógica, solo mapeo request/response
- Toda la lógica pura está en
domain/services
- Implementar generación de facturas con PDFKit
- Agregar filtros avanzados en listados
- Paginación en endpoints
- Audit log de cambios
- Reportes (ventas, servicios, etc.)
- WebSockets para notificaciones en tiempo real
- Tests unitarios y e2e
- API Documentation con Swagger
MIT