import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { PermissionGuardService } from './services'; import { Reflector } from '@nestjs/core'; import { PermissionModeConditional } from './interfaces'; import { AuthorizationGuardProvider } from './providers'; @Injectable() export class AuthorizationGuard implements CanActivate { public static MODE_METADATA_KEY: string = 'modes'; public static RESOURCE_METADATA_KEY: string = 'resource'; private readonly TAG: string = `${this.constructor.name}`; constructor(private readonly permissionGuardService: PermissionGuardService, private readonly reflector: Reflector, private readonly authorizationGuardProvider: AuthorizationGuardProvider) { } public async canActivate(context: ExecutionContext): Promise { const modes: Array> = this.reflector.get>>(AuthorizationGuard.MODE_METADATA_KEY, context.getHandler()); const headers = context.getArgByIndex(0).headers; const request = context.switchToHttp().getRequest(); return await this.authorizationGuardProvider.canActivate(request, headers, modes, request.resourceName, request.resourceId); } }