Files
dsc-api/src/modules/auth/guards/permission.guard.ts
T
2025-02-26 20:15:16 +03:30

33 lines
1.1 KiB
TypeScript
Executable File

import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from "@nestjs/common";
import { Reflector } from "@nestjs/core";
import { FastifyRequest } from "fastify";
import { PERMISSION_KEY } from "../../../common/decorators/permission.decorator";
import { AuthMessage } from "../../../common/enums/message.enum";
import { PermissionEnum } from "../../users/enums/permission.enum";
@Injectable()
export class PermissionsGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext) {
const requiredPermissions = this.reflector.getAllAndOverride<PermissionEnum[]>(PERMISSION_KEY, [
context.getHandler(),
context.getClass(),
]);
if (!requiredPermissions) return true;
const request = context.switchToHttp().getRequest<FastifyRequest>();
const user = request.user;
if (!user) throw new ForbiddenException(AuthMessage.UNAUTHORIZED_ACCESS);
const hasPermission = requiredPermissions.every((perm) => user.permissions.includes(perm));
if (!hasPermission) throw new ForbiddenException(AuthMessage.UNAUTHORIZED_ACCESS);
return true;
}
}