Skip to main content
La carpeta 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

  1. 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.
  2. Todo el tipado en los DTO: usa CreateDto, UpdateDto, FiltersDto y ResultDto en lugar de definir objetos de tipos complejos dentro del controller.
  3. Orden de decoradores: método HTTP → @ApiOperation → @ApiParam (solo si aplica) → @ApiResponse exitoso → @ApiResponse de error → @TraceNode.
  4. Los dos @ApiResponse son obligatorios para cada endpoint, aunque los códigos HTTP específicos puedan cambiar según la operación. Usa siempre el DTO del resultado y HttpErrorDto para los errores.
  5. @TraceNode es obligatorio, conciso y con solo name y type: 'controller'.
  6. Si el endpoint requiere Swagger multipart, interceptores u otros decoradores, agrégalos entre los anteriores según su necesidad, dejando @TraceNode al final.

Orden de los decoradores

user.controller.ts
Cuando no existe un parámetro de ruta, omite únicamente @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ón return. 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
Nota: el 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.