import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { AclData } from '../authorization/interfaces/acl-data.interface'; import { AuthorizationGuard } from '../authorization/authorization.guard'; import { AuthorizationError } from '../../exceptions/app-error/authorization-error'; import { ErrorCode } from '../../exceptions/app-error/models/enums'; import { AclGuardService } from './services'; @Injectable() export class AclGuard implements CanActivate { constructor(private readonly aclGuardService: AclGuardService, private readonly reflector: Reflector) { } public canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); const aclData: AclData = this.reflector.get(AuthorizationGuard.RESOURCE_METADATA_KEY, context.getHandler()); const validAcls: boolean = this.aclGuardService.canActivate(request, aclData); if (!validAcls) { throw new AuthorizationError(ErrorCode.INVALID_ACLS); } return validAcls; } }