import { createParamDecorator, ExecutionContext, SetMetadata, } from "@nestjs/common"; /** * Get the current authenticated user from request */ export const CurrentUser = createParamDecorator( (data: string | undefined, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); const user = request.user; if (data) { return user?.[data]; } return user; }, ); /** * Mark a route as public (no authentication required) */ export const IS_PUBLIC_KEY = "isPublic"; export const Public = () => SetMetadata(IS_PUBLIC_KEY, true); /** * Require specific roles to access a route */ export const ROLES_KEY = "roles"; export const Roles = (...roles: string[]) => SetMetadata(ROLES_KEY, roles); /** * Require specific permissions to access a route */ export const PERMISSIONS_KEY = "permissions"; export const RequirePermissions = (...permissions: string[]) => SetMetadata(PERMISSIONS_KEY, permissions); /** * Get tenant ID from request (for multi-tenancy) */ export const CurrentTenant = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.tenantId; }, ); /** * Get the current language from request headers */ export const CurrentLang = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.headers["accept-language"] || "en"; }, );