@flusys/nestjs-iam 7.1.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/index.d.ts +3 -3
- package/config/message-keys.d.ts +2 -0
- package/controllers/action.controller.d.ts +4 -4
- package/controllers/company-action-permission.controller.d.ts +2 -2
- package/controllers/index.d.ts +6 -6
- package/controllers/my-permission.controller.d.ts +3 -3
- package/controllers/role-permission.controller.d.ts +5 -4
- package/controllers/role.controller.d.ts +2 -2
- package/controllers/user-action-permission.controller.d.ts +5 -4
- package/docs/iam-swagger.config.d.ts +2 -2
- package/docs/index.d.ts +1 -1
- package/dtos/action.dto.d.ts +2 -2
- package/dtos/index.d.ts +3 -3
- package/dtos/permission.dto.d.ts +16 -0
- package/entities/action.entity.d.ts +2 -2
- package/entities/index.d.ts +11 -11
- package/entities/permission-with-company.entity.d.ts +1 -1
- package/entities/role-with-company.entity.d.ts +1 -1
- package/entities/role.entity.d.ts +1 -1
- package/entities/user-iam-permission.entity.d.ts +1 -1
- package/enums/index.d.ts +4 -4
- package/fesm/284.js +1316 -0
- package/fesm/867.js +3801 -0
- package/fesm/chunks/364.js +86 -0
- package/fesm/config/index.js +135 -3
- package/fesm/controllers/index.js +18 -7
- package/fesm/docs/index.js +240 -1
- package/fesm/dtos/index.js +1168 -3
- package/fesm/entities/index.js +670 -31
- package/fesm/enums/index.js +97 -4
- package/fesm/helpers/index.js +125 -2
- package/fesm/index.js +818 -11
- package/fesm/interfaces/index.js +17 -3
- package/fesm/modules/index.js +259 -1
- package/fesm/runtime.js +134 -0
- package/fesm/services/index.js +43 -6
- package/fesm/types/index.js +15 -1
- package/helpers/company-access.helper.d.ts +2 -2
- package/helpers/index.d.ts +2 -2
- package/helpers/permission-mode.helper.d.ts +1 -1
- package/index.d.ts +11 -11
- package/interfaces/action.interface.d.ts +2 -2
- package/interfaces/iam-module-options.interface.d.ts +3 -3
- package/interfaces/index.d.ts +3 -3
- package/modules/iam.module.d.ts +2 -2
- package/modules/index.d.ts +1 -1
- package/package.json +30 -37
- package/services/action.service.d.ts +9 -9
- package/services/iam-config.service.d.ts +4 -4
- package/services/iam-datasource.service.d.ts +3 -3
- package/services/index.d.ts +6 -6
- package/services/permission-cache.service.d.ts +5 -5
- package/services/permission.service.d.ts +6 -4
- package/services/role.service.d.ts +8 -8
- package/types/index.d.ts +1 -1
- package/cjs/config/event-actions.js +0 -36
- package/cjs/config/iam.constants.js +0 -11
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -71
- package/cjs/controllers/action.controller.js +0 -174
- package/cjs/controllers/action.controller.spec.js +0 -79
- package/cjs/controllers/company-action-permission.controller.js +0 -119
- package/cjs/controllers/company-action-permission.controller.spec.js +0 -65
- package/cjs/controllers/index.js +0 -23
- package/cjs/controllers/my-permission.controller.js +0 -147
- package/cjs/controllers/my-permission.controller.spec.js +0 -128
- package/cjs/controllers/role-permission.controller.js +0 -191
- package/cjs/controllers/role-permission.controller.spec.js +0 -140
- package/cjs/controllers/role.controller.js +0 -102
- package/cjs/controllers/role.controller.spec.js +0 -86
- package/cjs/controllers/user-action-permission.controller.js +0 -129
- package/cjs/controllers/user-action-permission.controller.spec.js +0 -68
- package/cjs/docs/iam-swagger.config.js +0 -209
- package/cjs/docs/iam-swagger.config.spec.js +0 -99
- package/cjs/docs/index.js +0 -18
- package/cjs/dtos/action.dto.js +0 -282
- package/cjs/dtos/index.js +0 -21
- package/cjs/dtos/permission.dto.js +0 -637
- package/cjs/dtos/role.dto.js +0 -155
- package/cjs/entities/action.entity.js +0 -138
- package/cjs/entities/index.js +0 -80
- package/cjs/entities/index.spec.js +0 -56
- package/cjs/entities/permission-base.entity.js +0 -107
- package/cjs/entities/permission-with-company.entity.js +0 -100
- package/cjs/entities/role-base.entity.js +0 -80
- package/cjs/entities/role-with-company.entity.js +0 -55
- package/cjs/entities/role.entity.js +0 -25
- package/cjs/entities/user-iam-permission.entity.js +0 -43
- package/cjs/enums/action-type.enum.js +0 -22
- package/cjs/enums/iam-entity-type.enum.js +0 -17
- package/cjs/enums/iam-permission-type.enum.js +0 -17
- package/cjs/enums/index.js +0 -21
- package/cjs/enums/permission-type.enum.js +0 -16
- package/cjs/helpers/company-access.helper.js +0 -23
- package/cjs/helpers/company-access.helper.spec.js +0 -68
- package/cjs/helpers/index.js +0 -19
- package/cjs/helpers/permission-mode.helper.js +0 -49
- package/cjs/helpers/permission-mode.helper.spec.js +0 -54
- package/cjs/index.js +0 -28
- package/cjs/interfaces/action.interface.js +0 -4
- package/cjs/interfaces/iam-module-options.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -20
- package/cjs/interfaces/role.interface.js +0 -7
- package/cjs/modules/iam.module.js +0 -186
- package/cjs/modules/iam.module.spec.js +0 -282
- package/cjs/modules/index.js +0 -18
- package/cjs/services/action.service.js +0 -337
- package/cjs/services/action.service.spec.js +0 -351
- package/cjs/services/iam-config.service.js +0 -87
- package/cjs/services/iam-config.service.spec.js +0 -110
- package/cjs/services/iam-datasource.service.js +0 -129
- package/cjs/services/iam-datasource.service.spec.js +0 -110
- package/cjs/services/index.js +0 -23
- package/cjs/services/permission-cache.service.js +0 -544
- package/cjs/services/permission-cache.service.spec.js +0 -718
- package/cjs/services/permission.service.js +0 -914
- package/cjs/services/permission.service.spec.js +0 -918
- package/cjs/services/role.service.js +0 -224
- package/cjs/services/role.service.spec.js +0 -347
- package/cjs/types/index.js +0 -18
- package/cjs/types/logic-node.type.js +0 -30
- package/fesm/config/event-actions.js +0 -15
- package/fesm/config/iam.constants.js +0 -1
- package/fesm/config/message-keys.js +0 -35
- package/fesm/controllers/action.controller.js +0 -164
- package/fesm/controllers/action.controller.spec.js +0 -75
- package/fesm/controllers/company-action-permission.controller.js +0 -109
- package/fesm/controllers/company-action-permission.controller.spec.js +0 -61
- package/fesm/controllers/my-permission.controller.js +0 -137
- package/fesm/controllers/my-permission.controller.spec.js +0 -124
- package/fesm/controllers/role-permission.controller.js +0 -181
- package/fesm/controllers/role-permission.controller.spec.js +0 -136
- package/fesm/controllers/role.controller.js +0 -92
- package/fesm/controllers/role.controller.spec.js +0 -82
- package/fesm/controllers/user-action-permission.controller.js +0 -119
- package/fesm/controllers/user-action-permission.controller.spec.js +0 -64
- package/fesm/docs/iam-swagger.config.js +0 -199
- package/fesm/docs/iam-swagger.config.spec.js +0 -95
- package/fesm/dtos/action.dto.js +0 -252
- package/fesm/dtos/permission.dto.js +0 -571
- package/fesm/dtos/role.dto.js +0 -134
- package/fesm/entities/action.entity.js +0 -128
- package/fesm/entities/index.spec.js +0 -52
- package/fesm/entities/permission-base.entity.js +0 -100
- package/fesm/entities/permission-with-company.entity.js +0 -90
- package/fesm/entities/role-base.entity.js +0 -70
- package/fesm/entities/role-with-company.entity.js +0 -45
- package/fesm/entities/role.entity.js +0 -15
- package/fesm/entities/user-iam-permission.entity.js +0 -33
- package/fesm/enums/action-type.enum.js +0 -12
- package/fesm/enums/iam-entity-type.enum.js +0 -7
- package/fesm/enums/iam-permission-type.enum.js +0 -7
- package/fesm/enums/permission-type.enum.js +0 -6
- package/fesm/helpers/company-access.helper.js +0 -18
- package/fesm/helpers/company-access.helper.spec.js +0 -64
- package/fesm/helpers/permission-mode.helper.js +0 -49
- package/fesm/helpers/permission-mode.helper.spec.js +0 -50
- package/fesm/interfaces/action.interface.js +0 -3
- package/fesm/interfaces/iam-module-options.interface.js +0 -3
- package/fesm/interfaces/role.interface.js +0 -4
- package/fesm/modules/iam.module.js +0 -176
- package/fesm/modules/iam.module.spec.js +0 -278
- package/fesm/services/action.service.js +0 -327
- package/fesm/services/action.service.spec.js +0 -347
- package/fesm/services/iam-config.service.js +0 -77
- package/fesm/services/iam-config.service.spec.js +0 -106
- package/fesm/services/iam-datasource.service.js +0 -78
- package/fesm/services/iam-datasource.service.spec.js +0 -106
- package/fesm/services/permission-cache.service.js +0 -527
- package/fesm/services/permission-cache.service.spec.js +0 -714
- package/fesm/services/permission.service.js +0 -904
- package/fesm/services/permission.service.spec.js +0 -914
- package/fesm/services/role.service.js +0 -214
- package/fesm/services/role.service.spec.js +0 -343
- package/fesm/types/logic-node.type.js +0 -27
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
function _ts_metadata(k, v) {
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
-
}
|
|
23
|
-
function _ts_param(paramIndex, decorator) {
|
|
24
|
-
return function(target, key) {
|
|
25
|
-
decorator(target, key, paramIndex);
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
import { ApiResponseDto, CurrentUser, ILoggedUserInfo, JwtAuthGuard, PermissionGuard, RequirePermission, ROLE_ACTION_PERMISSIONS, USER_ROLE_PERMISSIONS } from '@flusys/nestjs-shared';
|
|
29
|
-
import { Body, Controller, Inject, Post, UseGuards } from '@nestjs/common';
|
|
30
|
-
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
|
|
31
|
-
import { PERMISSION_OPERATION_MESSAGES, ROLE_PERMISSION_MESSAGES } from '../config';
|
|
32
|
-
import { AssignRoleActionsDto, AssignUserRolesDto, GetRoleActionsDto, GetUserRolesDto, PermissionOperationResultDto, RoleActionResponseDto, UserRoleResponseDto } from '../dtos/permission.dto';
|
|
33
|
-
import { validateCompanyAccess } from '../helpers';
|
|
34
|
-
import { IAMConfigService } from '../services/iam-config.service';
|
|
35
|
-
import { PermissionService } from '../services/permission.service';
|
|
36
|
-
export class RolePermissionController {
|
|
37
|
-
async assignRoleActions(dto) {
|
|
38
|
-
const result = await this.permissionService.assignRoleActions(dto);
|
|
39
|
-
return {
|
|
40
|
-
success: true,
|
|
41
|
-
message: 'Role actions updated successfully',
|
|
42
|
-
messageKey: PERMISSION_OPERATION_MESSAGES.PROCESS_SUCCESS,
|
|
43
|
-
messageVariables: {
|
|
44
|
-
added: result.added,
|
|
45
|
-
removed: result.removed,
|
|
46
|
-
total: result.total
|
|
47
|
-
},
|
|
48
|
-
data: result
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
async getRoleActions(dto) {
|
|
52
|
-
const actions = await this.permissionService.getRoleActions(dto.roleId);
|
|
53
|
-
return {
|
|
54
|
-
success: true,
|
|
55
|
-
message: 'Role actions retrieved successfully',
|
|
56
|
-
messageKey: ROLE_PERMISSION_MESSAGES.ACTIONS_SUCCESS,
|
|
57
|
-
data: actions
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
async assignUserRoles(dto, user) {
|
|
61
|
-
validateCompanyAccess(this.config, dto.companyId, user);
|
|
62
|
-
const result = await this.permissionService.assignUserRoles(dto);
|
|
63
|
-
return {
|
|
64
|
-
success: true,
|
|
65
|
-
message: 'User roles updated successfully',
|
|
66
|
-
messageKey: PERMISSION_OPERATION_MESSAGES.PROCESS_SUCCESS,
|
|
67
|
-
messageVariables: {
|
|
68
|
-
added: result.added,
|
|
69
|
-
removed: result.removed,
|
|
70
|
-
total: result.total
|
|
71
|
-
},
|
|
72
|
-
data: result
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
async getUserRoles(dto, user) {
|
|
76
|
-
validateCompanyAccess(this.config, dto.companyId, user);
|
|
77
|
-
const roles = await this.permissionService.getUserRoles(dto.userId, dto.branchId, dto.companyId);
|
|
78
|
-
return {
|
|
79
|
-
success: true,
|
|
80
|
-
message: 'User roles retrieved successfully',
|
|
81
|
-
messageKey: ROLE_PERMISSION_MESSAGES.USER_ROLES_SUCCESS,
|
|
82
|
-
data: roles
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
// NOTE: @Inject() required for bundled code - type metadata may be lost during esbuild
|
|
86
|
-
constructor(permissionService, config){
|
|
87
|
-
_define_property(this, "permissionService", void 0);
|
|
88
|
-
_define_property(this, "config", void 0);
|
|
89
|
-
this.permissionService = permissionService;
|
|
90
|
-
this.config = config;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
_ts_decorate([
|
|
94
|
-
Post('role-actions/assign'),
|
|
95
|
-
RequirePermission(ROLE_ACTION_PERMISSIONS.ASSIGN),
|
|
96
|
-
ApiOperation({
|
|
97
|
-
summary: 'Assign/remove actions to/from role',
|
|
98
|
-
description: 'RBAC mode. No branch scoping.'
|
|
99
|
-
}),
|
|
100
|
-
ApiResponseDto(PermissionOperationResultDto),
|
|
101
|
-
ApiBody({
|
|
102
|
-
type: AssignRoleActionsDto
|
|
103
|
-
}),
|
|
104
|
-
_ts_param(0, Body()),
|
|
105
|
-
_ts_metadata("design:type", Function),
|
|
106
|
-
_ts_metadata("design:paramtypes", [
|
|
107
|
-
typeof AssignRoleActionsDto === "undefined" ? Object : AssignRoleActionsDto
|
|
108
|
-
]),
|
|
109
|
-
_ts_metadata("design:returntype", Promise)
|
|
110
|
-
], RolePermissionController.prototype, "assignRoleActions", null);
|
|
111
|
-
_ts_decorate([
|
|
112
|
-
Post('get-role-actions'),
|
|
113
|
-
RequirePermission(ROLE_ACTION_PERMISSIONS.READ),
|
|
114
|
-
ApiOperation({
|
|
115
|
-
summary: 'Get role actions',
|
|
116
|
-
description: 'Returns actions assigned to role.'
|
|
117
|
-
}),
|
|
118
|
-
ApiResponseDto(RoleActionResponseDto, true, 'single'),
|
|
119
|
-
ApiBody({
|
|
120
|
-
type: GetRoleActionsDto
|
|
121
|
-
}),
|
|
122
|
-
_ts_param(0, Body()),
|
|
123
|
-
_ts_metadata("design:type", Function),
|
|
124
|
-
_ts_metadata("design:paramtypes", [
|
|
125
|
-
typeof GetRoleActionsDto === "undefined" ? Object : GetRoleActionsDto
|
|
126
|
-
]),
|
|
127
|
-
_ts_metadata("design:returntype", Promise)
|
|
128
|
-
], RolePermissionController.prototype, "getRoleActions", null);
|
|
129
|
-
_ts_decorate([
|
|
130
|
-
Post('user-roles/assign'),
|
|
131
|
-
RequirePermission(USER_ROLE_PERMISSIONS.ASSIGN),
|
|
132
|
-
ApiOperation({
|
|
133
|
-
summary: 'Assign/remove roles to/from user',
|
|
134
|
-
description: 'RBAC mode. If company feature enabled, branchId is required.'
|
|
135
|
-
}),
|
|
136
|
-
ApiResponseDto(PermissionOperationResultDto),
|
|
137
|
-
ApiBody({
|
|
138
|
-
type: AssignUserRolesDto
|
|
139
|
-
}),
|
|
140
|
-
_ts_param(0, Body()),
|
|
141
|
-
_ts_param(1, CurrentUser()),
|
|
142
|
-
_ts_metadata("design:type", Function),
|
|
143
|
-
_ts_metadata("design:paramtypes", [
|
|
144
|
-
typeof AssignUserRolesDto === "undefined" ? Object : AssignUserRolesDto,
|
|
145
|
-
typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
|
|
146
|
-
]),
|
|
147
|
-
_ts_metadata("design:returntype", Promise)
|
|
148
|
-
], RolePermissionController.prototype, "assignUserRoles", null);
|
|
149
|
-
_ts_decorate([
|
|
150
|
-
Post('get-user-roles'),
|
|
151
|
-
RequirePermission(USER_ROLE_PERMISSIONS.READ),
|
|
152
|
-
ApiOperation({
|
|
153
|
-
summary: 'Get user roles',
|
|
154
|
-
description: 'Returns roles assigned to user. Filter by companyId and branchId.'
|
|
155
|
-
}),
|
|
156
|
-
ApiResponseDto(UserRoleResponseDto, true, 'single'),
|
|
157
|
-
ApiBody({
|
|
158
|
-
type: GetUserRolesDto
|
|
159
|
-
}),
|
|
160
|
-
_ts_param(0, Body()),
|
|
161
|
-
_ts_param(1, CurrentUser()),
|
|
162
|
-
_ts_metadata("design:type", Function),
|
|
163
|
-
_ts_metadata("design:paramtypes", [
|
|
164
|
-
typeof GetUserRolesDto === "undefined" ? Object : GetUserRolesDto,
|
|
165
|
-
typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
|
|
166
|
-
]),
|
|
167
|
-
_ts_metadata("design:returntype", Promise)
|
|
168
|
-
], RolePermissionController.prototype, "getUserRoles", null);
|
|
169
|
-
RolePermissionController = _ts_decorate([
|
|
170
|
-
ApiTags('IAM - Role Permissions'),
|
|
171
|
-
Controller('iam/permissions'),
|
|
172
|
-
UseGuards(JwtAuthGuard, PermissionGuard),
|
|
173
|
-
ApiBearerAuth(),
|
|
174
|
-
_ts_param(0, Inject(PermissionService)),
|
|
175
|
-
_ts_param(1, Inject(IAMConfigService)),
|
|
176
|
-
_ts_metadata("design:type", Function),
|
|
177
|
-
_ts_metadata("design:paramtypes", [
|
|
178
|
-
typeof PermissionService === "undefined" ? Object : PermissionService,
|
|
179
|
-
typeof IAMConfigService === "undefined" ? Object : IAMConfigService
|
|
180
|
-
])
|
|
181
|
-
], RolePermissionController);
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { ForbiddenException } from '@nestjs/common';
|
|
2
|
-
import { buildMockUser } from '@test-utils/mocks/logged-user.mock';
|
|
3
|
-
import { RolePermissionController } from './role-permission.controller';
|
|
4
|
-
describe('RolePermissionController', ()=>{
|
|
5
|
-
let controller;
|
|
6
|
-
let mockPermissionService;
|
|
7
|
-
let mockConfig;
|
|
8
|
-
beforeEach(()=>{
|
|
9
|
-
mockPermissionService = {
|
|
10
|
-
assignRoleActions: jest.fn(),
|
|
11
|
-
getRoleActions: jest.fn(),
|
|
12
|
-
assignUserRoles: jest.fn(),
|
|
13
|
-
getUserRoles: jest.fn()
|
|
14
|
-
};
|
|
15
|
-
mockConfig = {
|
|
16
|
-
isCompanyFeatureEnabled: jest.fn().mockReturnValue(false)
|
|
17
|
-
};
|
|
18
|
-
controller = new RolePermissionController(mockPermissionService, mockConfig);
|
|
19
|
-
});
|
|
20
|
-
describe('assignRoleActions', ()=>{
|
|
21
|
-
it('assigns actions to a role and returns the operation summary', async ()=>{
|
|
22
|
-
mockPermissionService.assignRoleActions.mockResolvedValue({
|
|
23
|
-
added: 2,
|
|
24
|
-
removed: 1,
|
|
25
|
-
total: 3
|
|
26
|
-
});
|
|
27
|
-
const result = await controller.assignRoleActions({
|
|
28
|
-
roleId: 'role-1',
|
|
29
|
-
actionIds: [
|
|
30
|
-
'action-1',
|
|
31
|
-
'action-2'
|
|
32
|
-
]
|
|
33
|
-
});
|
|
34
|
-
expect(mockPermissionService.assignRoleActions).toHaveBeenCalledWith({
|
|
35
|
-
roleId: 'role-1',
|
|
36
|
-
actionIds: [
|
|
37
|
-
'action-1',
|
|
38
|
-
'action-2'
|
|
39
|
-
]
|
|
40
|
-
});
|
|
41
|
-
expect(result.success).toBe(true);
|
|
42
|
-
expect(result.data).toEqual({
|
|
43
|
-
added: 2,
|
|
44
|
-
removed: 1,
|
|
45
|
-
total: 3
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
describe('getRoleActions', ()=>{
|
|
50
|
-
it('returns actions assigned to the role', async ()=>{
|
|
51
|
-
mockPermissionService.getRoleActions.mockResolvedValue([
|
|
52
|
-
{
|
|
53
|
-
actionId: 'action-1'
|
|
54
|
-
}
|
|
55
|
-
]);
|
|
56
|
-
const result = await controller.getRoleActions({
|
|
57
|
-
roleId: 'role-1'
|
|
58
|
-
});
|
|
59
|
-
expect(mockPermissionService.getRoleActions).toHaveBeenCalledWith('role-1');
|
|
60
|
-
expect(result.data).toEqual([
|
|
61
|
-
{
|
|
62
|
-
actionId: 'action-1'
|
|
63
|
-
}
|
|
64
|
-
]);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
describe('assignUserRoles', ()=>{
|
|
68
|
-
it('assigns roles to a user when the caller has access to the target company', async ()=>{
|
|
69
|
-
mockConfig.isCompanyFeatureEnabled.mockReturnValue(true);
|
|
70
|
-
const user = buildMockUser({
|
|
71
|
-
companyId: 'company-1'
|
|
72
|
-
});
|
|
73
|
-
mockPermissionService.assignUserRoles.mockResolvedValue({
|
|
74
|
-
added: 1,
|
|
75
|
-
removed: 0,
|
|
76
|
-
total: 1
|
|
77
|
-
});
|
|
78
|
-
const result = await controller.assignUserRoles({
|
|
79
|
-
userId: 'user-2',
|
|
80
|
-
roleIds: [
|
|
81
|
-
'role-1'
|
|
82
|
-
],
|
|
83
|
-
companyId: 'company-1'
|
|
84
|
-
}, user);
|
|
85
|
-
expect(mockPermissionService.assignUserRoles).toHaveBeenCalledWith({
|
|
86
|
-
userId: 'user-2',
|
|
87
|
-
roleIds: [
|
|
88
|
-
'role-1'
|
|
89
|
-
],
|
|
90
|
-
companyId: 'company-1'
|
|
91
|
-
});
|
|
92
|
-
expect(result.data).toEqual({
|
|
93
|
-
added: 1,
|
|
94
|
-
removed: 0,
|
|
95
|
-
total: 1
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
it('rejects assignment when the caller has no access to the target company', async ()=>{
|
|
99
|
-
mockConfig.isCompanyFeatureEnabled.mockReturnValue(true);
|
|
100
|
-
const user = buildMockUser({
|
|
101
|
-
companyId: 'company-1'
|
|
102
|
-
});
|
|
103
|
-
await expect(controller.assignUserRoles({
|
|
104
|
-
userId: 'user-2',
|
|
105
|
-
roleIds: [
|
|
106
|
-
'role-1'
|
|
107
|
-
],
|
|
108
|
-
companyId: 'company-2'
|
|
109
|
-
}, user)).rejects.toThrow(ForbiddenException);
|
|
110
|
-
expect(mockPermissionService.assignUserRoles).not.toHaveBeenCalled();
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
describe('getUserRoles', ()=>{
|
|
114
|
-
it('returns roles assigned to the user scoped by branch and company', async ()=>{
|
|
115
|
-
const user = buildMockUser({
|
|
116
|
-
companyId: 'company-1'
|
|
117
|
-
});
|
|
118
|
-
mockPermissionService.getUserRoles.mockResolvedValue([
|
|
119
|
-
{
|
|
120
|
-
roleId: 'role-1'
|
|
121
|
-
}
|
|
122
|
-
]);
|
|
123
|
-
const result = await controller.getUserRoles({
|
|
124
|
-
userId: 'user-2',
|
|
125
|
-
branchId: 'branch-1',
|
|
126
|
-
companyId: 'company-1'
|
|
127
|
-
}, user);
|
|
128
|
-
expect(mockPermissionService.getUserRoles).toHaveBeenCalledWith('user-2', 'branch-1', 'company-1');
|
|
129
|
-
expect(result.data).toEqual([
|
|
130
|
-
{
|
|
131
|
-
roleId: 'role-1'
|
|
132
|
-
}
|
|
133
|
-
]);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
});
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
function _ts_metadata(k, v) {
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
-
}
|
|
23
|
-
function _ts_param(paramIndex, decorator) {
|
|
24
|
-
return function(target, key) {
|
|
25
|
-
decorator(target, key, paramIndex);
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
import { createApiController, ROLE_PERMISSIONS } from '@flusys/nestjs-shared';
|
|
29
|
-
import { Controller, Inject } from '@nestjs/common';
|
|
30
|
-
import { ApiTags } from '@nestjs/swagger';
|
|
31
|
-
import { CreateRoleDto, RoleResponseDto, UpdateRoleDto } from '../dtos/role.dto';
|
|
32
|
-
import { RoleService } from '../services/role.service';
|
|
33
|
-
export class RoleController extends createApiController(CreateRoleDto, UpdateRoleDto, RoleResponseDto, {
|
|
34
|
-
entityName: 'role',
|
|
35
|
-
security: {
|
|
36
|
-
insert: {
|
|
37
|
-
level: 'permission',
|
|
38
|
-
permissions: [
|
|
39
|
-
ROLE_PERMISSIONS.CREATE
|
|
40
|
-
]
|
|
41
|
-
},
|
|
42
|
-
insertMany: {
|
|
43
|
-
level: 'permission',
|
|
44
|
-
permissions: [
|
|
45
|
-
ROLE_PERMISSIONS.CREATE
|
|
46
|
-
]
|
|
47
|
-
},
|
|
48
|
-
getById: {
|
|
49
|
-
level: 'permission',
|
|
50
|
-
permissions: [
|
|
51
|
-
ROLE_PERMISSIONS.READ
|
|
52
|
-
]
|
|
53
|
-
},
|
|
54
|
-
getAll: {
|
|
55
|
-
level: 'permission',
|
|
56
|
-
permissions: [
|
|
57
|
-
ROLE_PERMISSIONS.READ
|
|
58
|
-
]
|
|
59
|
-
},
|
|
60
|
-
update: {
|
|
61
|
-
level: 'permission',
|
|
62
|
-
permissions: [
|
|
63
|
-
ROLE_PERMISSIONS.UPDATE
|
|
64
|
-
]
|
|
65
|
-
},
|
|
66
|
-
updateMany: {
|
|
67
|
-
level: 'permission',
|
|
68
|
-
permissions: [
|
|
69
|
-
ROLE_PERMISSIONS.UPDATE
|
|
70
|
-
]
|
|
71
|
-
},
|
|
72
|
-
delete: {
|
|
73
|
-
level: 'permission',
|
|
74
|
-
permissions: [
|
|
75
|
-
ROLE_PERMISSIONS.DELETE
|
|
76
|
-
]
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}) {
|
|
80
|
-
constructor(roleService){
|
|
81
|
-
super(roleService), _define_property(this, "roleService", void 0), this.roleService = roleService;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
RoleController = _ts_decorate([
|
|
85
|
-
ApiTags('IAM - Roles'),
|
|
86
|
-
Controller('iam/roles'),
|
|
87
|
-
_ts_param(0, Inject(RoleService)),
|
|
88
|
-
_ts_metadata("design:type", Function),
|
|
89
|
-
_ts_metadata("design:paramtypes", [
|
|
90
|
-
typeof RoleService === "undefined" ? Object : RoleService
|
|
91
|
-
])
|
|
92
|
-
], RoleController);
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { buildMockUser } from '@test-utils/mocks/logged-user.mock';
|
|
2
|
-
import { RoleController } from './role.controller';
|
|
3
|
-
function buildRole(overrides = {}) {
|
|
4
|
-
return {
|
|
5
|
-
id: 'role-1',
|
|
6
|
-
name: 'Admin',
|
|
7
|
-
description: null,
|
|
8
|
-
isActive: true,
|
|
9
|
-
readOnly: false,
|
|
10
|
-
createdAt: new Date(),
|
|
11
|
-
updatedAt: new Date(),
|
|
12
|
-
...overrides
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
describe('RoleController', ()=>{
|
|
16
|
-
let controller;
|
|
17
|
-
let mockRoleService;
|
|
18
|
-
beforeEach(()=>{
|
|
19
|
-
mockRoleService = {
|
|
20
|
-
insert: jest.fn(),
|
|
21
|
-
findById: jest.fn(),
|
|
22
|
-
getAll: jest.fn(),
|
|
23
|
-
update: jest.fn(),
|
|
24
|
-
delete: jest.fn()
|
|
25
|
-
};
|
|
26
|
-
controller = new RoleController(mockRoleService);
|
|
27
|
-
});
|
|
28
|
-
it('wires the injected service onto the generated controller base', ()=>{
|
|
29
|
-
expect(controller.roleService).toBe(mockRoleService);
|
|
30
|
-
expect(controller.service).toBe(mockRoleService);
|
|
31
|
-
});
|
|
32
|
-
describe('insert', ()=>{
|
|
33
|
-
it('creates a role and returns the mapped response', async ()=>{
|
|
34
|
-
const user = buildMockUser();
|
|
35
|
-
mockRoleService.insert.mockResolvedValue(buildRole());
|
|
36
|
-
const result = await controller.insert({
|
|
37
|
-
name: 'Admin'
|
|
38
|
-
}, user);
|
|
39
|
-
expect(mockRoleService.insert).toHaveBeenCalledWith({
|
|
40
|
-
name: 'Admin'
|
|
41
|
-
}, user);
|
|
42
|
-
expect(result.success).toBe(true);
|
|
43
|
-
expect(result.data).toEqual(expect.objectContaining({
|
|
44
|
-
id: 'role-1',
|
|
45
|
-
name: 'Admin'
|
|
46
|
-
}));
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
describe('getAll', ()=>{
|
|
50
|
-
it('paginates roles and maps the response list', async ()=>{
|
|
51
|
-
mockRoleService.getAll.mockResolvedValue({
|
|
52
|
-
data: [
|
|
53
|
-
buildRole()
|
|
54
|
-
],
|
|
55
|
-
total: 1
|
|
56
|
-
});
|
|
57
|
-
const result = await controller.getAll({}, buildMockUser(), '');
|
|
58
|
-
expect(mockRoleService.getAll).toHaveBeenCalledWith('', {}, buildMockUser());
|
|
59
|
-
expect(result.data).toHaveLength(1);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
describe('delete', ()=>{
|
|
63
|
-
it('delegates soft-delete to the service', async ()=>{
|
|
64
|
-
mockRoleService.delete.mockResolvedValue({
|
|
65
|
-
count: 1
|
|
66
|
-
});
|
|
67
|
-
const result = await controller.delete({
|
|
68
|
-
id: [
|
|
69
|
-
'role-1'
|
|
70
|
-
],
|
|
71
|
-
type: 'delete'
|
|
72
|
-
}, buildMockUser());
|
|
73
|
-
expect(mockRoleService.delete).toHaveBeenCalledWith({
|
|
74
|
-
id: [
|
|
75
|
-
'role-1'
|
|
76
|
-
],
|
|
77
|
-
type: 'delete'
|
|
78
|
-
}, buildMockUser());
|
|
79
|
-
expect(result.success).toBe(true);
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
function _ts_metadata(k, v) {
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
-
}
|
|
23
|
-
function _ts_param(paramIndex, decorator) {
|
|
24
|
-
return function(target, key) {
|
|
25
|
-
decorator(target, key, paramIndex);
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
import { ApiResponseDto, CurrentUser, ILoggedUserInfo, JwtAuthGuard, PermissionGuard, RequirePermission, USER_ACTION_PERMISSIONS } from '@flusys/nestjs-shared';
|
|
29
|
-
import { Body, Controller, Inject, Post, UseGuards } from '@nestjs/common';
|
|
30
|
-
import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
|
|
31
|
-
import { PERMISSION_OPERATION_MESSAGES, USER_ACTION_PERMISSION_MESSAGES } from '../config';
|
|
32
|
-
import { AssignUserActionsDto, GetUserActionsDto, PermissionOperationResultDto, UserActionResponseDto } from '../dtos/permission.dto';
|
|
33
|
-
import { IAMConfigService } from '../services/iam-config.service';
|
|
34
|
-
import { PermissionService } from '../services/permission.service';
|
|
35
|
-
export class UserActionPermissionController {
|
|
36
|
-
async assignUserActions(dto, user) {
|
|
37
|
-
const result = await this.permissionService.assignUserActions(dto);
|
|
38
|
-
return {
|
|
39
|
-
success: true,
|
|
40
|
-
message: 'User actions updated successfully',
|
|
41
|
-
messageKey: PERMISSION_OPERATION_MESSAGES.PROCESS_SUCCESS,
|
|
42
|
-
messageVariables: {
|
|
43
|
-
added: result.added,
|
|
44
|
-
removed: result.removed,
|
|
45
|
-
total: result.total
|
|
46
|
-
},
|
|
47
|
-
data: result
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
async getUserActions(dto, user) {
|
|
51
|
-
const actions = await this.permissionService.getUserActions(dto.userId, dto.companyId, dto.branchId);
|
|
52
|
-
return {
|
|
53
|
-
success: true,
|
|
54
|
-
message: 'User actions retrieved successfully',
|
|
55
|
-
messageKey: USER_ACTION_PERMISSION_MESSAGES.GET_SUCCESS,
|
|
56
|
-
data: actions
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
// NOTE: @Inject() required for bundled code - type metadata may be lost during esbuild
|
|
60
|
-
constructor(permissionService, config){
|
|
61
|
-
_define_property(this, "permissionService", void 0);
|
|
62
|
-
_define_property(this, "config", void 0);
|
|
63
|
-
this.permissionService = permissionService;
|
|
64
|
-
this.config = config;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
_ts_decorate([
|
|
68
|
-
Post('user-actions/assign'),
|
|
69
|
-
RequirePermission(USER_ACTION_PERMISSIONS.ASSIGN),
|
|
70
|
-
ApiOperation({
|
|
71
|
-
summary: 'Assign/remove actions to/from user',
|
|
72
|
-
description: 'Direct permissions. If company feature enabled, branchId is required.'
|
|
73
|
-
}),
|
|
74
|
-
ApiResponseDto(PermissionOperationResultDto),
|
|
75
|
-
ApiBody({
|
|
76
|
-
type: AssignUserActionsDto
|
|
77
|
-
}),
|
|
78
|
-
_ts_param(0, Body()),
|
|
79
|
-
_ts_param(1, CurrentUser()),
|
|
80
|
-
_ts_metadata("design:type", Function),
|
|
81
|
-
_ts_metadata("design:paramtypes", [
|
|
82
|
-
typeof AssignUserActionsDto === "undefined" ? Object : AssignUserActionsDto,
|
|
83
|
-
typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
|
|
84
|
-
]),
|
|
85
|
-
_ts_metadata("design:returntype", Promise)
|
|
86
|
-
], UserActionPermissionController.prototype, "assignUserActions", null);
|
|
87
|
-
_ts_decorate([
|
|
88
|
-
Post('get-user-actions'),
|
|
89
|
-
RequirePermission(USER_ACTION_PERMISSIONS.READ),
|
|
90
|
-
ApiOperation({
|
|
91
|
-
summary: 'Get user direct actions',
|
|
92
|
-
description: 'Returns direct action permissions for user. Filter by companyId and branchId.'
|
|
93
|
-
}),
|
|
94
|
-
ApiResponseDto(UserActionResponseDto, true, 'single'),
|
|
95
|
-
ApiBody({
|
|
96
|
-
type: GetUserActionsDto
|
|
97
|
-
}),
|
|
98
|
-
_ts_param(0, Body()),
|
|
99
|
-
_ts_param(1, CurrentUser()),
|
|
100
|
-
_ts_metadata("design:type", Function),
|
|
101
|
-
_ts_metadata("design:paramtypes", [
|
|
102
|
-
typeof GetUserActionsDto === "undefined" ? Object : GetUserActionsDto,
|
|
103
|
-
typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
|
|
104
|
-
]),
|
|
105
|
-
_ts_metadata("design:returntype", Promise)
|
|
106
|
-
], UserActionPermissionController.prototype, "getUserActions", null);
|
|
107
|
-
UserActionPermissionController = _ts_decorate([
|
|
108
|
-
ApiTags('IAM - User Action Permissions'),
|
|
109
|
-
Controller('iam/permissions'),
|
|
110
|
-
UseGuards(JwtAuthGuard, PermissionGuard),
|
|
111
|
-
ApiBearerAuth(),
|
|
112
|
-
_ts_param(0, Inject(PermissionService)),
|
|
113
|
-
_ts_param(1, Inject(IAMConfigService)),
|
|
114
|
-
_ts_metadata("design:type", Function),
|
|
115
|
-
_ts_metadata("design:paramtypes", [
|
|
116
|
-
typeof PermissionService === "undefined" ? Object : PermissionService,
|
|
117
|
-
typeof IAMConfigService === "undefined" ? Object : IAMConfigService
|
|
118
|
-
])
|
|
119
|
-
], UserActionPermissionController);
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { buildMockUser } from '@test-utils/mocks/logged-user.mock';
|
|
2
|
-
import { UserActionPermissionController } from './user-action-permission.controller';
|
|
3
|
-
describe('UserActionPermissionController', ()=>{
|
|
4
|
-
let controller;
|
|
5
|
-
let mockPermissionService;
|
|
6
|
-
let mockConfig;
|
|
7
|
-
beforeEach(()=>{
|
|
8
|
-
mockPermissionService = {
|
|
9
|
-
assignUserActions: jest.fn(),
|
|
10
|
-
getUserActions: jest.fn()
|
|
11
|
-
};
|
|
12
|
-
mockConfig = {};
|
|
13
|
-
controller = new UserActionPermissionController(mockPermissionService, mockConfig);
|
|
14
|
-
});
|
|
15
|
-
describe('assignUserActions', ()=>{
|
|
16
|
-
it('assigns direct action permissions to a user', async ()=>{
|
|
17
|
-
const user = buildMockUser();
|
|
18
|
-
mockPermissionService.assignUserActions.mockResolvedValue({
|
|
19
|
-
added: 1,
|
|
20
|
-
removed: 0,
|
|
21
|
-
total: 1
|
|
22
|
-
});
|
|
23
|
-
const result = await controller.assignUserActions({
|
|
24
|
-
userId: 'user-2',
|
|
25
|
-
actionIds: [
|
|
26
|
-
'action-1'
|
|
27
|
-
]
|
|
28
|
-
}, user);
|
|
29
|
-
expect(mockPermissionService.assignUserActions).toHaveBeenCalledWith({
|
|
30
|
-
userId: 'user-2',
|
|
31
|
-
actionIds: [
|
|
32
|
-
'action-1'
|
|
33
|
-
]
|
|
34
|
-
});
|
|
35
|
-
expect(result.success).toBe(true);
|
|
36
|
-
expect(result.data).toEqual({
|
|
37
|
-
added: 1,
|
|
38
|
-
removed: 0,
|
|
39
|
-
total: 1
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
describe('getUserActions', ()=>{
|
|
44
|
-
it('returns direct action permissions for a user scoped by branch/company', async ()=>{
|
|
45
|
-
const user = buildMockUser();
|
|
46
|
-
mockPermissionService.getUserActions.mockResolvedValue([
|
|
47
|
-
{
|
|
48
|
-
actionId: 'action-1'
|
|
49
|
-
}
|
|
50
|
-
]);
|
|
51
|
-
const result = await controller.getUserActions({
|
|
52
|
-
userId: 'user-2',
|
|
53
|
-
branchId: 'branch-1',
|
|
54
|
-
companyId: 'company-1'
|
|
55
|
-
}, user);
|
|
56
|
-
expect(mockPermissionService.getUserActions).toHaveBeenCalledWith('user-2', 'company-1', 'branch-1');
|
|
57
|
-
expect(result.data).toEqual([
|
|
58
|
-
{
|
|
59
|
-
actionId: 'action-1'
|
|
60
|
-
}
|
|
61
|
-
]);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
});
|