import type { CanActivate, ExecutionContext } from '@nestjs/common' import { Injectable, mixin } from '@nestjs/common' import type { Type, AuthGuard, IAuthGuard } from '@nestjs/passport' import type { PermissionsSpec } from './permission-based-access-control.service.js' import { PermissionBasedAccessControlService } from './permission-based-access-control.service.js' export interface PermissionsGuardOptions { mode?: 'one' | 'all', authGuard?: Type | Parameters[0] } export const PERMISSIONS_GUARD_OPTIONS = Symbol('PermissionsGuardOptions') export function PermissionsGuard (permissions: PermissionsSpec, options?: PermissionsGuardOptions): Type { @Injectable() class PermissionsGuardMixin implements CanActivate { constructor (private service: PermissionBasedAccessControlService) { } canActivate (context: ExecutionContext): boolean | Promise { if (options?.mode === 'all') { return this.service.hasAllPermissions(context, permissions) } return this.service.hasOnePermission(context, permissions) } } return mixin(PermissionsGuardMixin) }