Decoradores
Ubicados en src/app/core/decorators/.
@Auth()
Aplica AuthGuard al endpoint. Equivalente a @UseGuards(AuthGuard) pero más legible.
@Auth()
@Get('profile')
getProfile() { ... }
@ApiKeyAuth()
Aplica ApiKeyGuard. Para endpoints consumidos por clientes externos.
@ApiKeyAuth()
@Post('webhook')
receiveWebhook() { ... }
@CurrentUser()
Extrae el usuario autenticado de request.user. Usado dentro de controladores protegidos por @Auth().
@Auth()
@Get('me')
getMe(@CurrentUser() user: UserInterface) {
return user;
}
@Lang()
Extrae la preferencia de idioma del request (header Accept-Language o query param). Usado para internacionalización de mensajes de respuesta.
@Get('labels')
getLabels(@Lang() lang: string) { ... }
@CatchWebSocket()
Decorador de manejo de errores para eventos WebSocket. Captura excepciones en los handlers del gateway y las convierte al formato de error estándar del WS.
// En ChatGateway
@CatchWebSocket()
@SubscribeMessage('send_message')
handleSendMessage(@MessageBody() dto: SendMessageDto) { ... }
@RawResponse()
src/app/core/decorators/raw-response.decorator.ts. Marca un handler o controlador con la metadata rawResponse; el ResponseInterceptor entonces no aplica el formato { statusCode, status, message, data }. Útil para webhooks de terceros (que esperan un cuerpo exacto) y redirects.
@Get(':channelType')
@RawResponse()
@Header('Content-Type', 'text/plain')
verify(...) { ... }
@RequirePermission(acronym)
src/app/core/decorators/require-permission.decorator.ts. Declara el permiso que debe tener el rol del usuario para ejecutar un handler (o todo un controlador). Solo escribe metadata con SetMetadata(PERMISSION_KEY, acronym), donde PERMISSION_KEY vale 'permission'; la comprobación real la hace PermissionsGuard.
Recibe un único acrónimo (un string), por ejemplo USER_CREATE o ACCESS_CONTROL_READ. Los acrónimos del catálogo siguen el patrón {MODULO}_{CREATE|READ|UPDATE|DELETE} más algunos permisos extra de tickets (ver RBAC).
@UseGuards(PermissionsGuard)
@Auth()
@Controller({ path: API_PATHS.USERS, version: API_VERSION.V1 })
export class UserController {
@RequirePermission('USER_CREATE')
@Post(CRUD_ROUTES.CREATE)
create(...) { ... }
// Sin @RequirePermission: basta con estar autenticado
@Get('get-me')
getMe(...) { ... }
}
:::warning Requiere el guard
El decorador por sí solo no protege nada: el controlador debe declarar @UseGuards(PermissionsGuard) junto con @Auth(). Sin el guard, la metadata se ignora.
:::
@Roles(...roles)
roles.decorator.ts. Guarda en la metadata roles una lista de valores de userType (admin, agent). Lo lee RolesGuard (ver Guards).
@Roles('admin')
@PlatformAdmin()
platform-admin.decorator.ts. Compone UseGuards(AuthGuard, PlatformAdminGuard): exige sesión válida y que el usuario tenga isPlatformAdmin === true.
@Paginate()
paginate.decorator.ts. Decorador de parámetro que lee page y limit del query string y devuelve { page, limit }. page mínimo 1; limit se acota entre 1 y PAGINATION.MAX_LIMIT, y usa los valores por defecto de PAGINATION si no son numéricos.