feat: added role decorator and guard

This commit is contained in:
2026-08-01 00:47:22 +03:30
parent 1ead663ddf
commit 1df68e8788
3 changed files with 46 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
import {
CanActivate,
ExecutionContext,
ForbiddenException,
Injectable,
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Observable } from 'rxjs';
import { ROLE_KEY } from 'src/common/decorators/role-decorator';
import { RoleType } from 'src/modules/users/enums/user-role.enum';
import { IRequest } from '../interfaces/IRequest';
import { AuthMessages } from 'src/common/enums/messages.enum';
@Injectable()
export class RoleGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const requiredRoles = this.reflector.getAllAndOverride<RoleType[]>(
ROLE_KEY,
[context.getHandler(), context.getClass()],
);
if (!requiredRoles) return true;
const req = context.switchToHttp().getRequest<IRequest>();
const user = req.user;
if (!user) throw new ForbiddenException(AuthMessages.UNAUTHORIZED_ACCESS);
const hasRole = requiredRoles.every((role) => user.roles.includes(role));
if (!hasRole)
throw new ForbiddenException(AuthMessages.UNAUTHORIZED_ACCESS);
return true;
}
}