61 lines
1.4 KiB
TypeScript
Executable File
61 lines
1.4 KiB
TypeScript
Executable File
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";
|
|
},
|
|
);
|