src/modules organiza la aplicación NestJS por funcionalidades. Cada módulo agrupa HTTP, lógica de negocio, inyección de dependencias y DTOs sin mezclar estas responsabilidades con las consultas de base de datos.
Estructura y nombres
Usa archivos con nombre[entidad].[tipo].ts y el sufijo que identifica su responsabilidad:
*.controller.ts, *.service.ts, *.module.ts y una carpeta dto/ con los DTO necesarios. Los guards y estrategias pueden agregarse si la funcionalidad lo requiere.
Separación estricta de responsabilidades
Controllers: reglas obligatorias
- Métodos de un solo retorno: cada handler delega directamente al service con
return this.servicio.metodo(...); la conversión de rutas numéricas se realiza con pipes (por ejemploParseIntPipe). - Documentación Swagger completa: cada endpoint incluye método HTTP,
@ApiOperationy respuestas@ApiResponsede éxito y error (HttpErrorDto). - Orden de decoradores: método HTTP →
@ApiOperation→@ApiParam(si aplica) →@ApiResponsede éxito →@ApiResponsede error →@TraceNode. - Trazabilidad obligatoria:
@TraceNode({ name: 'Acción legible', type: 'controller' })cierra la lista de decoradores del handler. - Parámetros y resultados tipados: usa DTOs en lugar de
anyy no dupliques definiciones complejas dentro del controller. - Rutas protegidas: aplica
@UseGuardsy@ApiBearerAuthdonde la ruta requiera autenticación; no expongas rutas públicas o privadas por accidente.
Services: reglas obligatorias
- Inyecta las clases
Querypertinentes; toda lectura/escritura a PostgreSQL se efectúa ensrc/queries. - Los métodos invocados directamente por controllers utilizan
@Trace({ name: '...', type: 'service' }). - Los métodos auxiliares se instrumentan con
type: 'method'otype: 'transformation'cuando corresponda. - Sanitiza campos de texto en
createyupdateconStringFunctionsegún la necesidad del dato; preserva secretos y campos excluidos. - La paginación estándar devuelve
{ data, meta: PaginationFunction.createPaginationMeta(total, page, limit) }. - Para evitar consultas N+1, agrupa identificadores, consulta en lote y relaciona resultados con
Mapcuando sea posible. - Maneja los errores de negocio y no expongas contraseñas, hashes ni datos sensibles en el resultado.
DTOs y modules
- Coloca los DTOs por funcionalidad; para entidades múltiples, subdivide
dto/por entidad. - Documenta propiedades con
@ApiPropertyo@ApiPropertyOptionaly valida entradas conclass-validatoryclass-transformer. - Usa
@Trace({ type: 'validation' })para clases de DTO con validación, siguiendo la convención de trazabilidad. - Para DTOs de actualización, utiliza
PartialType(CreateDto)cuando corresponda. - Reutiliza los enums de las tablas Drizzle —por ejemplo,
user.role.enumValues— en el tipo, la validación y Swagger; no dupliques listas de valores. - Registra controllers, services y queries en
@Module. Exporta solo los providers que otros módulos necesiten. - Los DTO compartidos de error y paginación en la estructura actual están en
src/dto(no en el antiguosrc/models).
Guía y ejemplos de implementación
Consulta Guía de módulos para ver ejemplos completos de un módulo simple (auth), otro con subfuncionalidades (admin/user), los decoradores de controllers y los DTOs de respuesta.
Esta página describe las convenciones comunes; los archivos concretos y sus ejemplos mantienen el detalle de implementación.
