@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.
Files changed (175) hide show
  1. package/config/index.d.ts +3 -3
  2. package/config/message-keys.d.ts +2 -0
  3. package/controllers/action.controller.d.ts +4 -4
  4. package/controllers/company-action-permission.controller.d.ts +2 -2
  5. package/controllers/index.d.ts +6 -6
  6. package/controllers/my-permission.controller.d.ts +3 -3
  7. package/controllers/role-permission.controller.d.ts +5 -4
  8. package/controllers/role.controller.d.ts +2 -2
  9. package/controllers/user-action-permission.controller.d.ts +5 -4
  10. package/docs/iam-swagger.config.d.ts +2 -2
  11. package/docs/index.d.ts +1 -1
  12. package/dtos/action.dto.d.ts +2 -2
  13. package/dtos/index.d.ts +3 -3
  14. package/dtos/permission.dto.d.ts +16 -0
  15. package/entities/action.entity.d.ts +2 -2
  16. package/entities/index.d.ts +11 -11
  17. package/entities/permission-with-company.entity.d.ts +1 -1
  18. package/entities/role-with-company.entity.d.ts +1 -1
  19. package/entities/role.entity.d.ts +1 -1
  20. package/entities/user-iam-permission.entity.d.ts +1 -1
  21. package/enums/index.d.ts +4 -4
  22. package/fesm/284.js +1316 -0
  23. package/fesm/867.js +3801 -0
  24. package/fesm/chunks/364.js +86 -0
  25. package/fesm/config/index.js +135 -3
  26. package/fesm/controllers/index.js +18 -7
  27. package/fesm/docs/index.js +240 -1
  28. package/fesm/dtos/index.js +1168 -3
  29. package/fesm/entities/index.js +670 -31
  30. package/fesm/enums/index.js +97 -4
  31. package/fesm/helpers/index.js +125 -2
  32. package/fesm/index.js +818 -11
  33. package/fesm/interfaces/index.js +17 -3
  34. package/fesm/modules/index.js +259 -1
  35. package/fesm/runtime.js +134 -0
  36. package/fesm/services/index.js +43 -6
  37. package/fesm/types/index.js +15 -1
  38. package/helpers/company-access.helper.d.ts +2 -2
  39. package/helpers/index.d.ts +2 -2
  40. package/helpers/permission-mode.helper.d.ts +1 -1
  41. package/index.d.ts +11 -11
  42. package/interfaces/action.interface.d.ts +2 -2
  43. package/interfaces/iam-module-options.interface.d.ts +3 -3
  44. package/interfaces/index.d.ts +3 -3
  45. package/modules/iam.module.d.ts +2 -2
  46. package/modules/index.d.ts +1 -1
  47. package/package.json +30 -37
  48. package/services/action.service.d.ts +9 -9
  49. package/services/iam-config.service.d.ts +4 -4
  50. package/services/iam-datasource.service.d.ts +3 -3
  51. package/services/index.d.ts +6 -6
  52. package/services/permission-cache.service.d.ts +5 -5
  53. package/services/permission.service.d.ts +6 -4
  54. package/services/role.service.d.ts +8 -8
  55. package/types/index.d.ts +1 -1
  56. package/cjs/config/event-actions.js +0 -36
  57. package/cjs/config/iam.constants.js +0 -11
  58. package/cjs/config/index.js +0 -20
  59. package/cjs/config/message-keys.js +0 -71
  60. package/cjs/controllers/action.controller.js +0 -174
  61. package/cjs/controllers/action.controller.spec.js +0 -79
  62. package/cjs/controllers/company-action-permission.controller.js +0 -119
  63. package/cjs/controllers/company-action-permission.controller.spec.js +0 -65
  64. package/cjs/controllers/index.js +0 -23
  65. package/cjs/controllers/my-permission.controller.js +0 -147
  66. package/cjs/controllers/my-permission.controller.spec.js +0 -128
  67. package/cjs/controllers/role-permission.controller.js +0 -191
  68. package/cjs/controllers/role-permission.controller.spec.js +0 -140
  69. package/cjs/controllers/role.controller.js +0 -102
  70. package/cjs/controllers/role.controller.spec.js +0 -86
  71. package/cjs/controllers/user-action-permission.controller.js +0 -129
  72. package/cjs/controllers/user-action-permission.controller.spec.js +0 -68
  73. package/cjs/docs/iam-swagger.config.js +0 -209
  74. package/cjs/docs/iam-swagger.config.spec.js +0 -99
  75. package/cjs/docs/index.js +0 -18
  76. package/cjs/dtos/action.dto.js +0 -282
  77. package/cjs/dtos/index.js +0 -21
  78. package/cjs/dtos/permission.dto.js +0 -637
  79. package/cjs/dtos/role.dto.js +0 -155
  80. package/cjs/entities/action.entity.js +0 -138
  81. package/cjs/entities/index.js +0 -80
  82. package/cjs/entities/index.spec.js +0 -56
  83. package/cjs/entities/permission-base.entity.js +0 -107
  84. package/cjs/entities/permission-with-company.entity.js +0 -100
  85. package/cjs/entities/role-base.entity.js +0 -80
  86. package/cjs/entities/role-with-company.entity.js +0 -55
  87. package/cjs/entities/role.entity.js +0 -25
  88. package/cjs/entities/user-iam-permission.entity.js +0 -43
  89. package/cjs/enums/action-type.enum.js +0 -22
  90. package/cjs/enums/iam-entity-type.enum.js +0 -17
  91. package/cjs/enums/iam-permission-type.enum.js +0 -17
  92. package/cjs/enums/index.js +0 -21
  93. package/cjs/enums/permission-type.enum.js +0 -16
  94. package/cjs/helpers/company-access.helper.js +0 -23
  95. package/cjs/helpers/company-access.helper.spec.js +0 -68
  96. package/cjs/helpers/index.js +0 -19
  97. package/cjs/helpers/permission-mode.helper.js +0 -49
  98. package/cjs/helpers/permission-mode.helper.spec.js +0 -54
  99. package/cjs/index.js +0 -28
  100. package/cjs/interfaces/action.interface.js +0 -4
  101. package/cjs/interfaces/iam-module-options.interface.js +0 -4
  102. package/cjs/interfaces/index.js +0 -20
  103. package/cjs/interfaces/role.interface.js +0 -7
  104. package/cjs/modules/iam.module.js +0 -186
  105. package/cjs/modules/iam.module.spec.js +0 -282
  106. package/cjs/modules/index.js +0 -18
  107. package/cjs/services/action.service.js +0 -337
  108. package/cjs/services/action.service.spec.js +0 -351
  109. package/cjs/services/iam-config.service.js +0 -87
  110. package/cjs/services/iam-config.service.spec.js +0 -110
  111. package/cjs/services/iam-datasource.service.js +0 -129
  112. package/cjs/services/iam-datasource.service.spec.js +0 -110
  113. package/cjs/services/index.js +0 -23
  114. package/cjs/services/permission-cache.service.js +0 -544
  115. package/cjs/services/permission-cache.service.spec.js +0 -718
  116. package/cjs/services/permission.service.js +0 -914
  117. package/cjs/services/permission.service.spec.js +0 -918
  118. package/cjs/services/role.service.js +0 -224
  119. package/cjs/services/role.service.spec.js +0 -347
  120. package/cjs/types/index.js +0 -18
  121. package/cjs/types/logic-node.type.js +0 -30
  122. package/fesm/config/event-actions.js +0 -15
  123. package/fesm/config/iam.constants.js +0 -1
  124. package/fesm/config/message-keys.js +0 -35
  125. package/fesm/controllers/action.controller.js +0 -164
  126. package/fesm/controllers/action.controller.spec.js +0 -75
  127. package/fesm/controllers/company-action-permission.controller.js +0 -109
  128. package/fesm/controllers/company-action-permission.controller.spec.js +0 -61
  129. package/fesm/controllers/my-permission.controller.js +0 -137
  130. package/fesm/controllers/my-permission.controller.spec.js +0 -124
  131. package/fesm/controllers/role-permission.controller.js +0 -181
  132. package/fesm/controllers/role-permission.controller.spec.js +0 -136
  133. package/fesm/controllers/role.controller.js +0 -92
  134. package/fesm/controllers/role.controller.spec.js +0 -82
  135. package/fesm/controllers/user-action-permission.controller.js +0 -119
  136. package/fesm/controllers/user-action-permission.controller.spec.js +0 -64
  137. package/fesm/docs/iam-swagger.config.js +0 -199
  138. package/fesm/docs/iam-swagger.config.spec.js +0 -95
  139. package/fesm/dtos/action.dto.js +0 -252
  140. package/fesm/dtos/permission.dto.js +0 -571
  141. package/fesm/dtos/role.dto.js +0 -134
  142. package/fesm/entities/action.entity.js +0 -128
  143. package/fesm/entities/index.spec.js +0 -52
  144. package/fesm/entities/permission-base.entity.js +0 -100
  145. package/fesm/entities/permission-with-company.entity.js +0 -90
  146. package/fesm/entities/role-base.entity.js +0 -70
  147. package/fesm/entities/role-with-company.entity.js +0 -45
  148. package/fesm/entities/role.entity.js +0 -15
  149. package/fesm/entities/user-iam-permission.entity.js +0 -33
  150. package/fesm/enums/action-type.enum.js +0 -12
  151. package/fesm/enums/iam-entity-type.enum.js +0 -7
  152. package/fesm/enums/iam-permission-type.enum.js +0 -7
  153. package/fesm/enums/permission-type.enum.js +0 -6
  154. package/fesm/helpers/company-access.helper.js +0 -18
  155. package/fesm/helpers/company-access.helper.spec.js +0 -64
  156. package/fesm/helpers/permission-mode.helper.js +0 -49
  157. package/fesm/helpers/permission-mode.helper.spec.js +0 -50
  158. package/fesm/interfaces/action.interface.js +0 -3
  159. package/fesm/interfaces/iam-module-options.interface.js +0 -3
  160. package/fesm/interfaces/role.interface.js +0 -4
  161. package/fesm/modules/iam.module.js +0 -176
  162. package/fesm/modules/iam.module.spec.js +0 -278
  163. package/fesm/services/action.service.js +0 -327
  164. package/fesm/services/action.service.spec.js +0 -347
  165. package/fesm/services/iam-config.service.js +0 -77
  166. package/fesm/services/iam-config.service.spec.js +0 -106
  167. package/fesm/services/iam-datasource.service.js +0 -78
  168. package/fesm/services/iam-datasource.service.spec.js +0 -106
  169. package/fesm/services/permission-cache.service.js +0 -527
  170. package/fesm/services/permission-cache.service.spec.js +0 -714
  171. package/fesm/services/permission.service.js +0 -904
  172. package/fesm/services/permission.service.spec.js +0 -914
  173. package/fesm/services/role.service.js +0 -214
  174. package/fesm/services/role.service.spec.js +0 -343
  175. 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
- });