- STEP1 : create @Role annotation using metadata (nestjs doc)
import { SetMetadata } from '@nestjs/common';
import { UserRole } from 'src/users/entities/user.entity';
export enum UserRole {
Host = 'Host',
Listener = 'Listener',
}
export type AllowedRoles = keyof typeof UserRole | 'Any';
export const Role = (roles: AllowedRoles[]) => SetMetadata('roles', roles);
- STEP2 : AuthGuard determine continue process with checking Role
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private readonly reflector: Reflector) {}
canActivate(context: ExecutionContext) {
const roles = this.reflector.get('roles', context.getHandler());
console.log('CanActivie roles: ', roles);
if (!roles) {
return true;
}
........
return roles.includes(user.role);
}
- STEP3 : add providers using APP_GUARD(global)
import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { AuthGuard } from './auth.guard';
@Module({
providers: [
{
provide: APP_GUARD,
useClass: AuthGuard,
},
],
})
export class AuthModule {}
- STEP4 : add AuthModule to AppModule
- STEP5 : use @Role like this (@Role([‘Host’]) or @Role([‘Any’])….)
@Mutation(returns => EditProfileOutput)
@Role(['Host'])
editProfile(
@AuthUser() authUser: User,
@Args('input') editProfileInput: EditProfileInput,
): Promise<EditProfileOutput> {
return this.usersService.editProfile(authUser.id, editProfileInput);
}