33 lines
1.1 KiB
TypeScript
Executable File
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;
|
|
}
|
|
}
|