Skip to content

Commit 6d98f47

Browse files
committed
feat: add support for many roles for users
1 parent e4c41dc commit 6d98f47

File tree

104 files changed

+661
-172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+661
-172
lines changed

generators/auth/templates/mongodb/jwt/src/decorators/serialization.decorator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export function setSerializeType(target:any, serializeType: any) {
1010
Reflect.defineMetadata(SERIALIZE_TYPE_KEY, serializeType, target);
1111
}
1212

13-
const Serialize = (role: any) => (proto: any, propName: any, descriptor: any) => {
14-
setSerializeType(proto[propName], role);
13+
const Serialize = (roles: any) => (proto: any, propName: any, descriptor: any) => {
14+
setSerializeType(proto[propName], roles);
1515
UseInterceptors(ClassSerializerInterceptor)(proto, propName, descriptor);
1616
UseInterceptors(SerializeInterceptor)(proto, propName, descriptor);
1717
};
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
1+
import { Request } from 'express';
12
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
23
import { Reflector } from '@nestjs/core';
3-
import { Request } from 'express';
4+
45
import { RolesEnum } from '@decorators/roles.decorator';
56
import { UserDocument } from '@v1/users/schemas/users.schema';
67

78
@Injectable()
89
export default class RolesGuard implements CanActivate {
910
constructor(
1011
private reflector: Reflector,
11-
) { }
12+
) {}
1213

1314
async canActivate(context: ExecutionContext): Promise<boolean> {
14-
const roles = this.reflector.get<string[]>('roles', context.getHandler());
15+
const roles = this.reflector.get<RolesEnum[]>('roles', context.getHandler());
16+
1517
if (!roles) {
1618
return true;
1719
}
20+
1821
const request: Request = context.switchToHttp().getRequest();
1922
const user = request.user as UserDocument;
2023

21-
return user.role === RolesEnum.ADMIN || roles.includes(user.role);
24+
return roles.some((role: RolesEnum) => user.roles.includes(role as RolesEnum));
2225
}
2326
}

generators/auth/templates/mongodb/jwt/src/interfaces/jwt-decode-response.interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { RolesEnum } from '@decorators/roles.decorator';
33
export interface JwtDecodeResponse {
44
id: string,
55
email: string,
6-
role: RolesEnum,
6+
roles: RolesEnum[],
77
iat: number,
88
exp: number,
99
}

generators/auth/templates/mongodb/jwt/src/modules/v1/auth/auth.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ export default class AuthController {
218218
const payload = {
219219
_id: decodedUser._id,
220220
email: decodedUser.email,
221-
role: decodedUser.role,
221+
roles: decodedUser.roles,
222222
};
223223

224224
return this.authService.login(payload);

generators/auth/templates/mongodb/jwt/src/modules/v1/auth/auth.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default class AuthService {
3939
return {
4040
_id: user._id,
4141
email: user.email,
42-
role: user.role,
42+
roles: user.roles,
4343
};
4444
}
4545

@@ -50,7 +50,7 @@ export default class AuthService {
5050
const payload: LoginPayload = {
5151
_id: data._id,
5252
email: data.email,
53-
role: data.role,
53+
roles: data.roles,
5454
};
5555

5656
const accessToken = this.jwtService.sign(payload, {

generators/auth/templates/mongodb/jwt/src/modules/v1/auth/interfaces/decoded-user.interface.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { Types } from 'mongoose';
22

3+
import { RolesEnum } from '@decorators/roles.decorator';
4+
35
export interface DecodedUser {
46
readonly _id: Types.ObjectId;
57

68
readonly email: string;
79

810
readonly password: string;
911

10-
readonly role: string;
12+
readonly roles: RolesEnum[];
1113

1214
readonly iat?: number;
1315

generators/auth/templates/mongodb/jwt/src/modules/v1/auth/interfaces/jwt-strategy-validate.interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ import { RolesEnum } from '@decorators/roles.decorator';
44
export interface JwtStrategyValidate {
55
_id: Types.ObjectId;
66
email: string;
7-
role: RolesEnum;
7+
roles: RolesEnum[];
88
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { Types } from 'mongoose';
22

3+
import { RolesEnum } from '@decorators/roles.decorator';
4+
35
export interface LoginPayload {
46
readonly _id?: Types.ObjectId;
57

68
readonly email: string;
79

8-
readonly role: string;
10+
readonly roles: RolesEnum[];
911
}

generators/auth/templates/mongodb/jwt/src/modules/v1/auth/interfaces/validate-user-output.interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ import { RolesEnum } from '@decorators/roles.decorator';
44
export interface ValidateUserOutput {
55
_id: Types.ObjectId;
66
email?: string;
7-
role?: RolesEnum;
7+
roles?: RolesEnum[];
88
}

generators/auth/templates/mongodb/jwt/src/modules/v1/auth/strategies/jwt-access.strategy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export default class JwtAccessStrategy extends PassportStrategy(Strategy, 'acces
2323
return {
2424
_id: payload._id,
2525
email: payload.email,
26-
role: payload.role,
26+
roles: payload.roles,
2727
};
2828
}
2929
}

0 commit comments

Comments
 (0)