src/modules agrupa funcionalidades por módulo. Cada módulo contiene como mínimo un controller, un service, un module y una carpeta dto. Los módulos sencillos, como auth, pueden guardar sus archivos directamente; los más grandes, como admin, se subdividen por funcionalidad.
Estructura recomendada
src/modules
Reglas obligatorias para controllers
- Un endpoint = una línea dentro del método:
return this.servicio.metodo(...). No ejecutar consultas, conversiones, validaciones ni otras operaciones dentro del controller. Esas tareas corresponden al service. - Todo el tipado en los DTO: usa
CreateDto,UpdateDto,FiltersDtoyResultDtoen lugar de definir objetos de tipos complejos dentro del controller. - Orden de decoradores: método HTTP →
@ApiOperation→@ApiParam(solo si aplica) →@ApiResponseexitoso →@ApiResponsede error →@TraceNode. - Los dos
@ApiResponseson obligatorios para cada endpoint, aunque los códigos HTTP específicos puedan cambiar según la operación. Usa siempre el DTO del resultado yHttpErrorDtopara los errores. @TraceNodees obligatorio, conciso y con solonameytype: 'controller'.- Si el endpoint requiere Swagger multipart, interceptores u otros decoradores, agrégalos entre los anteriores según su necesidad, dejando
@TraceNodeal final.
Orden de los decoradores
user.controller.ts
@ApiParam. Si hay anotaciones adicionales (por ejemplo, para subir archivos), puedes incluirlas:
external.controller.ts
Ejemplo: admin → user
user.controller.ts
Controller deliberadamente plano: todos los endpoints delegan directamente al servicio con una única instrucciónreturn. Los DTO concentran la documentación de los cuerpos, filtros y respuestas.
user.controller.ts
user.service.ts
Aquí sí se coloca la lógica de negocio: verificar existencia, preparar datos, procesar errores y llamar al query de su tabla.@Trace({ name: 'user', type: 'service' }) identifica cada operación del servicio.
user.service.ts
user.module.ts
user.module.ts
Carpeta dto
Estos DTO son ejemplos mínimos; cada módulo puede tener los necesarios.@ApiProperty documenta campos en Swagger y los decoradores de class-validator validan el contenido recibido.
user-create.dto.ts
user-update.dto.ts
user-result.dto.ts
user-list.dto.ts
Ejemplo: auth (módulo pequeño)
auth puede contener sus archivos directamente, sin subdividirse por entidad. Los archivos jwt-auth.guard.ts y jwt.strategy.ts son complementarios para proteger rutas, no reemplazan a los tres archivos mínimos ni la carpeta dto.
auth.controller.ts
auth.module.ts
auth.service.ts
login.dto.ts
login-response.dto.ts
AuthService mostrado es un esqueleto ilustrativo; no implementa un inicio de sesión real. En ambos casos, registra los módulos necesarios en el módulo padre para exponer sus rutas.
