import { CanActivate, ExecutionContext, ForbiddenException, Inject, Injectable } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import type { AuthenticatedRequest, Role } from './auth.types.js'; import { ROLES_KEY } from './roles.decorator.js'; @Injectable() export class RolesGuard implements CanActivate { constructor(@Inject(Reflector) private readonly reflector: Reflector) {} canActivate(context: ExecutionContext): boolean { const roles = this.reflector.getAllAndOverride(ROLES_KEY, [ context.getHandler(), context.getClass(), ]); if (roles === undefined || roles.length === 0) { return true; } const request = context.switchToHttp().getRequest(); if (!roles.includes(request.user.role)) { throw new ForbiddenException('Insufficient role'); } return true; } }