@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
package/fesm/867.js ADDED
@@ -0,0 +1,3801 @@
1
+ import { AUTH_MESSAGES } from "@flusys/nestjs-shared/constants";
2
+ import * as __rspack_external__flusys_nestjs_shared_393d2cae from "@flusys/nestjs-shared";
3
+ import * as __rspack_external__flusys_nestjs_shared_classes_6076a329 from "@flusys/nestjs-shared/classes";
4
+ import * as __rspack_external__flusys_nestjs_shared_modules_24702bee from "@flusys/nestjs-shared/modules";
5
+ import * as __rspack_external__nestjs_common_a04939da from "@nestjs/common";
6
+ import * as __rspack_external__nestjs_swagger_7cd450b5 from "@nestjs/swagger";
7
+ import * as __rspack_external_class_transformer_c5a479fb from "class-transformer";
8
+ import * as __rspack_external_class_validator_7b99ef4d from "class-validator";
9
+ import * as __rspack_external_typeorm from "typeorm";
10
+ import * as __rspack_external__nestjs_core_d7b00a1a from "@nestjs/core";
11
+ import * as __rspack_external__flusys_nestjs_core_config_197fa0a9 from "@flusys/nestjs-core/config";
12
+ import * as __rspack_external__flusys_nestjs_shared_utils_9125c1f1 from "@flusys/nestjs-shared/utils";
13
+ export const __rspack_esm_id = 867;
14
+ export const __rspack_esm_ids = [867];
15
+ export const __webpack_modules__ = {
16
+ 916(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
17
+ /**
18
+ * Domain event actions published by the IAM module, alongside the CRUD
19
+ * lifecycle actions every ApiService emits.
20
+ */ const IAM_EVENT_ACTIONS = {
21
+ PERMISSIONS_ASSIGNED: 'permissions-assigned'
22
+ };
23
+ /** Every entity the IAM module publishes under, ApiService backed or not */ const IAM_EVENT_ENTITIES = {
24
+ ACTION: 'action',
25
+ ROLE: 'role',
26
+ USER_ACTION: 'user_action',
27
+ ROLE_ACTION: 'role_action',
28
+ COMPANY_ACTION: 'company_action',
29
+ USER_ROLE: 'user_role'
30
+ };
31
+ const IAM_EVENT_MODULE = 'iam';
32
+
33
+ __webpack_require__.d(__webpack_exports__, {
34
+ }, {
35
+ H: IAM_EVENT_ENTITIES,
36
+ X: IAM_EVENT_ACTIONS
37
+ });
38
+
39
+
40
+ },
41
+ 180(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
42
+ const IAM_MODULE_OPTIONS = 'IAM_MODULE_OPTIONS';
43
+
44
+ __webpack_require__.d(__webpack_exports__, {
45
+ }, {
46
+ G: IAM_MODULE_OPTIONS
47
+ });
48
+
49
+
50
+ },
51
+ 490(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
52
+ // ==================== IAM MODULE MESSAGE KEYS ====================
53
+ const ACTION_MESSAGES = {
54
+ GET_ALL_SUCCESS: 'action.get.all.success',
55
+ READONLY_UPDATE_FORBIDDEN: 'action.readonly.update.forbidden',
56
+ READONLY_DELETE_FORBIDDEN: 'action.readonly.delete.forbidden'
57
+ };
58
+ const ROLE_MESSAGES = {
59
+ READONLY_UPDATE_FORBIDDEN: 'role.readonly.update.forbidden',
60
+ READONLY_DELETE_FORBIDDEN: 'role.readonly.delete.forbidden'
61
+ };
62
+ const PERMISSION_OPERATION_MESSAGES = {
63
+ PROCESS_SUCCESS: 'permission.process.success',
64
+ ALREADY_EXISTS: 'permission.already.exists',
65
+ USER_REQUIRED: 'permission.user.required'
66
+ };
67
+ const ROLE_PERMISSION_MESSAGES = {
68
+ ACTIONS_SUCCESS: 'role.permission.actions.success',
69
+ USER_ROLES_SUCCESS: 'role.permission.user.roles.success',
70
+ ROLE_USERS_SUCCESS: 'role.permission.role.users.success'
71
+ };
72
+ const USER_ACTION_PERMISSION_MESSAGES = {
73
+ GET_SUCCESS: 'user.action.permission.get.success',
74
+ ACTION_USERS_SUCCESS: 'user.action.permission.action.users.success'
75
+ };
76
+ const COMPANY_ACTION_PERMISSION_MESSAGES = {
77
+ GET_SUCCESS: 'company.action.permission.get.success'
78
+ };
79
+ const MY_PERMISSION_MESSAGES = {
80
+ GET_SUCCESS: 'my.permission.get.success',
81
+ MY_ROLES_SUCCESS: 'my.permission.roles.success',
82
+ MY_ACTIONS_SUCCESS: 'my.permission.actions.success'
83
+ };
84
+ const IAM_MODE_MESSAGES = {
85
+ DIRECT_MODE_UNAVAILABLE: 'iam.direct.mode.unavailable',
86
+ RBAC_MODE_UNAVAILABLE: 'iam.rbac.mode.unavailable',
87
+ ROLE_ASSIGNMENT_UNAVAILABLE: 'iam.role.assignment.unavailable'
88
+ };
89
+
90
+ __webpack_require__.d(__webpack_exports__, {
91
+ }, {
92
+ GG: COMPANY_ACTION_PERMISSION_MESSAGES,
93
+ P3: PERMISSION_OPERATION_MESSAGES,
94
+ Q$: ACTION_MESSAGES,
95
+ QW: ROLE_MESSAGES,
96
+ eh: ROLE_PERMISSION_MESSAGES,
97
+ k: USER_ACTION_PERMISSION_MESSAGES,
98
+ sb: MY_PERMISSION_MESSAGES,
99
+ xI: IAM_MODE_MESSAGES
100
+ });
101
+
102
+
103
+ },
104
+ 296(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
105
+ /* import */ var _nestjs_swagger__rspack_import_0 = __webpack_require__(176);
106
+ /* import */ var class_transformer__rspack_import_1 = __webpack_require__(812);
107
+ /* import */ var class_validator__rspack_import_2 = __webpack_require__(421);
108
+ function _ts_decorate(decorators, target, key, desc) {
109
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
110
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
111
+ r = Reflect.decorate(decorators, target, key, desc);
112
+ } else {
113
+ for(var i = decorators.length - 1; i >= 0; i--){
114
+ if (d = decorators[i]) {
115
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
116
+ }
117
+ }
118
+ }
119
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
120
+ }
121
+ function _ts_metadata(metadataKey, metadataValue) {
122
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
123
+ return Reflect.metadata(metadataKey, metadataValue);
124
+ }
125
+ }
126
+
127
+
128
+
129
+ var PermissionAction = /*#__PURE__*/ function(PermissionAction) {
130
+ PermissionAction["ADD"] = "add";
131
+ PermissionAction["REMOVE"] = "remove";
132
+ return PermissionAction;
133
+ }({});
134
+ class PermissionItemDto {
135
+ id;
136
+ action;
137
+ }
138
+ _ts_decorate([
139
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
140
+ description: 'ID of the target (action or role)'
141
+ }),
142
+ (0,class_validator__rspack_import_2.IsUUID)(),
143
+ _ts_metadata("design:type", String)
144
+ ], PermissionItemDto.prototype, "id", void 0);
145
+ _ts_decorate([
146
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
147
+ description: 'Action to perform',
148
+ enum: PermissionAction,
149
+ example: "add"
150
+ }),
151
+ (0,class_validator__rspack_import_2.IsEnum)(PermissionAction),
152
+ _ts_metadata("design:type", String)
153
+ ], PermissionItemDto.prototype, "action", void 0);
154
+ class AssignUserActionsDto {
155
+ userId;
156
+ companyId;
157
+ branchId;
158
+ items;
159
+ }
160
+ _ts_decorate([
161
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
162
+ description: 'User ID'
163
+ }),
164
+ (0,class_validator__rspack_import_2.IsUUID)(),
165
+ _ts_metadata("design:type", String)
166
+ ], AssignUserActionsDto.prototype, "userId", void 0);
167
+ _ts_decorate([
168
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
169
+ description: 'Company ID (for company-wide or branch-specific assignments)'
170
+ }),
171
+ (0,class_validator__rspack_import_2.IsUUID)(),
172
+ (0,class_validator__rspack_import_2.IsOptional)(),
173
+ _ts_metadata("design:type", String)
174
+ ], AssignUserActionsDto.prototype, "companyId", void 0);
175
+ _ts_decorate([
176
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
177
+ description: 'Branch ID (null = company-wide, set = branch-specific)'
178
+ }),
179
+ (0,class_validator__rspack_import_2.IsUUID)(),
180
+ (0,class_validator__rspack_import_2.IsOptional)(),
181
+ _ts_metadata("design:type", String)
182
+ ], AssignUserActionsDto.prototype, "branchId", void 0);
183
+ _ts_decorate([
184
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
185
+ description: 'Array of actions to assign/remove',
186
+ type: [
187
+ PermissionItemDto
188
+ ]
189
+ }),
190
+ (0,class_validator__rspack_import_2.IsArray)(),
191
+ (0,class_validator__rspack_import_2.ValidateNested)({
192
+ each: true
193
+ }),
194
+ (0,class_transformer__rspack_import_1.Type)(()=>PermissionItemDto),
195
+ _ts_metadata("design:type", Array)
196
+ ], AssignUserActionsDto.prototype, "items", void 0);
197
+ class AssignCompanyActionsDto {
198
+ companyId;
199
+ items;
200
+ }
201
+ _ts_decorate([
202
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
203
+ description: 'Company ID'
204
+ }),
205
+ (0,class_validator__rspack_import_2.IsUUID)(),
206
+ _ts_metadata("design:type", String)
207
+ ], AssignCompanyActionsDto.prototype, "companyId", void 0);
208
+ _ts_decorate([
209
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
210
+ description: 'Array of actions to assign/remove to company (whitelist)',
211
+ type: [
212
+ PermissionItemDto
213
+ ]
214
+ }),
215
+ (0,class_validator__rspack_import_2.IsArray)(),
216
+ (0,class_validator__rspack_import_2.ValidateNested)({
217
+ each: true
218
+ }),
219
+ (0,class_transformer__rspack_import_1.Type)(()=>PermissionItemDto),
220
+ _ts_metadata("design:type", Array)
221
+ ], AssignCompanyActionsDto.prototype, "items", void 0);
222
+ class AssignRoleActionsDto {
223
+ roleId;
224
+ items;
225
+ }
226
+ _ts_decorate([
227
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
228
+ description: 'Role ID'
229
+ }),
230
+ (0,class_validator__rspack_import_2.IsUUID)(),
231
+ _ts_metadata("design:type", String)
232
+ ], AssignRoleActionsDto.prototype, "roleId", void 0);
233
+ _ts_decorate([
234
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
235
+ description: 'Array of actions to assign/remove',
236
+ type: [
237
+ PermissionItemDto
238
+ ]
239
+ }),
240
+ (0,class_validator__rspack_import_2.IsArray)(),
241
+ (0,class_validator__rspack_import_2.ValidateNested)({
242
+ each: true
243
+ }),
244
+ (0,class_transformer__rspack_import_1.Type)(()=>PermissionItemDto),
245
+ _ts_metadata("design:type", Array)
246
+ ], AssignRoleActionsDto.prototype, "items", void 0);
247
+ class AssignUserRolesDto {
248
+ userId;
249
+ companyId;
250
+ branchId;
251
+ items;
252
+ }
253
+ _ts_decorate([
254
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
255
+ description: 'User ID'
256
+ }),
257
+ (0,class_validator__rspack_import_2.IsUUID)(),
258
+ _ts_metadata("design:type", String)
259
+ ], AssignUserRolesDto.prototype, "userId", void 0);
260
+ _ts_decorate([
261
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
262
+ description: 'Company ID (for company-wide or branch-specific assignments)'
263
+ }),
264
+ (0,class_validator__rspack_import_2.IsUUID)(),
265
+ (0,class_validator__rspack_import_2.IsOptional)(),
266
+ _ts_metadata("design:type", String)
267
+ ], AssignUserRolesDto.prototype, "companyId", void 0);
268
+ _ts_decorate([
269
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
270
+ description: 'Branch ID (null = company-wide, set = branch-specific)'
271
+ }),
272
+ (0,class_validator__rspack_import_2.IsUUID)(),
273
+ (0,class_validator__rspack_import_2.IsOptional)(),
274
+ _ts_metadata("design:type", String)
275
+ ], AssignUserRolesDto.prototype, "branchId", void 0);
276
+ _ts_decorate([
277
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
278
+ description: 'Array of roles to assign/remove',
279
+ type: [
280
+ PermissionItemDto
281
+ ]
282
+ }),
283
+ (0,class_validator__rspack_import_2.IsArray)(),
284
+ (0,class_validator__rspack_import_2.ValidateNested)({
285
+ each: true
286
+ }),
287
+ (0,class_transformer__rspack_import_1.Type)(()=>PermissionItemDto),
288
+ _ts_metadata("design:type", Array)
289
+ ], AssignUserRolesDto.prototype, "items", void 0);
290
+ class GetUserActionsDto {
291
+ userId;
292
+ companyId;
293
+ branchId;
294
+ }
295
+ _ts_decorate([
296
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
297
+ description: 'User ID to get actions for'
298
+ }),
299
+ (0,class_validator__rspack_import_2.IsUUID)(),
300
+ _ts_metadata("design:type", String)
301
+ ], GetUserActionsDto.prototype, "userId", void 0);
302
+ _ts_decorate([
303
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
304
+ description: 'Company ID (ignored when enableCompanyFeature is false)'
305
+ }),
306
+ (0,class_validator__rspack_import_2.IsUUID)(),
307
+ (0,class_validator__rspack_import_2.IsOptional)(),
308
+ _ts_metadata("design:type", String)
309
+ ], GetUserActionsDto.prototype, "companyId", void 0);
310
+ _ts_decorate([
311
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
312
+ description: 'Branch ID to filter by branch (ignored when enableCompanyFeature is false)'
313
+ }),
314
+ (0,class_validator__rspack_import_2.IsUUID)(),
315
+ (0,class_validator__rspack_import_2.IsOptional)(),
316
+ _ts_metadata("design:type", String)
317
+ ], GetUserActionsDto.prototype, "branchId", void 0);
318
+ class GetRoleActionsDto {
319
+ roleId;
320
+ }
321
+ _ts_decorate([
322
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
323
+ description: 'Role ID to get actions for'
324
+ }),
325
+ (0,class_validator__rspack_import_2.IsUUID)(),
326
+ _ts_metadata("design:type", String)
327
+ ], GetRoleActionsDto.prototype, "roleId", void 0);
328
+ class GetCompanyActionsDto {
329
+ companyId;
330
+ }
331
+ _ts_decorate([
332
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
333
+ description: 'Company ID to get actions for'
334
+ }),
335
+ (0,class_validator__rspack_import_2.IsUUID)(),
336
+ _ts_metadata("design:type", String)
337
+ ], GetCompanyActionsDto.prototype, "companyId", void 0);
338
+ class GetRoleUsersDto {
339
+ roleId;
340
+ }
341
+ _ts_decorate([
342
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
343
+ description: 'Role ID to get assigned users for'
344
+ }),
345
+ (0,class_validator__rspack_import_2.IsUUID)(),
346
+ _ts_metadata("design:type", String)
347
+ ], GetRoleUsersDto.prototype, "roleId", void 0);
348
+ class GetActionUsersDto {
349
+ actionId;
350
+ }
351
+ _ts_decorate([
352
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
353
+ description: 'Action ID to get assigned users for'
354
+ }),
355
+ (0,class_validator__rspack_import_2.IsUUID)(),
356
+ _ts_metadata("design:type", String)
357
+ ], GetActionUsersDto.prototype, "actionId", void 0);
358
+ class GetUserRolesDto {
359
+ userId;
360
+ companyId;
361
+ branchId;
362
+ }
363
+ _ts_decorate([
364
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
365
+ description: 'User ID to get roles for'
366
+ }),
367
+ (0,class_validator__rspack_import_2.IsUUID)(),
368
+ _ts_metadata("design:type", String)
369
+ ], GetUserRolesDto.prototype, "userId", void 0);
370
+ _ts_decorate([
371
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
372
+ description: 'Company ID (ignored when enableCompanyFeature is false)'
373
+ }),
374
+ (0,class_validator__rspack_import_2.IsUUID)(),
375
+ (0,class_validator__rspack_import_2.IsOptional)(),
376
+ _ts_metadata("design:type", String)
377
+ ], GetUserRolesDto.prototype, "companyId", void 0);
378
+ _ts_decorate([
379
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
380
+ description: 'Branch ID to filter by branch (ignored when enableCompanyFeature is false)'
381
+ }),
382
+ (0,class_validator__rspack_import_2.IsUUID)(),
383
+ (0,class_validator__rspack_import_2.IsOptional)(),
384
+ _ts_metadata("design:type", String)
385
+ ], GetUserRolesDto.prototype, "branchId", void 0);
386
+ class UserActionResponseDto {
387
+ id;
388
+ userId;
389
+ actionId;
390
+ actionCode;
391
+ actionName;
392
+ companyId;
393
+ branchId;
394
+ createdAt;
395
+ }
396
+ _ts_decorate([
397
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
398
+ description: 'Permission ID'
399
+ }),
400
+ _ts_metadata("design:type", String)
401
+ ], UserActionResponseDto.prototype, "id", void 0);
402
+ _ts_decorate([
403
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
404
+ description: 'User ID'
405
+ }),
406
+ _ts_metadata("design:type", String)
407
+ ], UserActionResponseDto.prototype, "userId", void 0);
408
+ _ts_decorate([
409
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
410
+ description: 'Action ID'
411
+ }),
412
+ _ts_metadata("design:type", String)
413
+ ], UserActionResponseDto.prototype, "actionId", void 0);
414
+ _ts_decorate([
415
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
416
+ description: 'Action code'
417
+ }),
418
+ _ts_metadata("design:type", String)
419
+ ], UserActionResponseDto.prototype, "actionCode", void 0);
420
+ _ts_decorate([
421
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
422
+ description: 'Action name'
423
+ }),
424
+ _ts_metadata("design:type", String)
425
+ ], UserActionResponseDto.prototype, "actionName", void 0);
426
+ _ts_decorate([
427
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
428
+ description: 'Company ID (null = global)'
429
+ }),
430
+ _ts_metadata("design:type", Object)
431
+ ], UserActionResponseDto.prototype, "companyId", void 0);
432
+ _ts_decorate([
433
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
434
+ description: 'Branch ID (null = company-wide)'
435
+ }),
436
+ _ts_metadata("design:type", Object)
437
+ ], UserActionResponseDto.prototype, "branchId", void 0);
438
+ _ts_decorate([
439
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
440
+ description: 'When this permission was created'
441
+ }),
442
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
443
+ ], UserActionResponseDto.prototype, "createdAt", void 0);
444
+ class RoleActionResponseDto {
445
+ id;
446
+ roleId;
447
+ actionId;
448
+ actionCode;
449
+ actionName;
450
+ createdAt;
451
+ }
452
+ _ts_decorate([
453
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
454
+ description: 'Permission ID'
455
+ }),
456
+ _ts_metadata("design:type", String)
457
+ ], RoleActionResponseDto.prototype, "id", void 0);
458
+ _ts_decorate([
459
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
460
+ description: 'Role ID'
461
+ }),
462
+ _ts_metadata("design:type", String)
463
+ ], RoleActionResponseDto.prototype, "roleId", void 0);
464
+ _ts_decorate([
465
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
466
+ description: 'Action ID'
467
+ }),
468
+ _ts_metadata("design:type", String)
469
+ ], RoleActionResponseDto.prototype, "actionId", void 0);
470
+ _ts_decorate([
471
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
472
+ description: 'Action code'
473
+ }),
474
+ _ts_metadata("design:type", String)
475
+ ], RoleActionResponseDto.prototype, "actionCode", void 0);
476
+ _ts_decorate([
477
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
478
+ description: 'Action name'
479
+ }),
480
+ _ts_metadata("design:type", String)
481
+ ], RoleActionResponseDto.prototype, "actionName", void 0);
482
+ _ts_decorate([
483
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
484
+ description: 'When this permission was created'
485
+ }),
486
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
487
+ ], RoleActionResponseDto.prototype, "createdAt", void 0);
488
+ class CompanyActionResponseDto {
489
+ id;
490
+ companyId;
491
+ actionId;
492
+ actionCode;
493
+ actionName;
494
+ createdAt;
495
+ }
496
+ _ts_decorate([
497
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
498
+ description: 'Permission ID'
499
+ }),
500
+ _ts_metadata("design:type", String)
501
+ ], CompanyActionResponseDto.prototype, "id", void 0);
502
+ _ts_decorate([
503
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
504
+ description: 'Company ID'
505
+ }),
506
+ _ts_metadata("design:type", String)
507
+ ], CompanyActionResponseDto.prototype, "companyId", void 0);
508
+ _ts_decorate([
509
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
510
+ description: 'Action ID'
511
+ }),
512
+ _ts_metadata("design:type", String)
513
+ ], CompanyActionResponseDto.prototype, "actionId", void 0);
514
+ _ts_decorate([
515
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
516
+ description: 'Action Code'
517
+ }),
518
+ _ts_metadata("design:type", String)
519
+ ], CompanyActionResponseDto.prototype, "actionCode", void 0);
520
+ _ts_decorate([
521
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
522
+ description: 'Action Name'
523
+ }),
524
+ _ts_metadata("design:type", String)
525
+ ], CompanyActionResponseDto.prototype, "actionName", void 0);
526
+ _ts_decorate([
527
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
528
+ description: 'When this permission was created'
529
+ }),
530
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
531
+ ], CompanyActionResponseDto.prototype, "createdAt", void 0);
532
+ class UserRoleResponseDto {
533
+ id;
534
+ userId;
535
+ roleId;
536
+ roleName;
537
+ branchId;
538
+ createdAt;
539
+ }
540
+ _ts_decorate([
541
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
542
+ description: 'Permission ID'
543
+ }),
544
+ _ts_metadata("design:type", String)
545
+ ], UserRoleResponseDto.prototype, "id", void 0);
546
+ _ts_decorate([
547
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
548
+ description: 'User ID'
549
+ }),
550
+ _ts_metadata("design:type", String)
551
+ ], UserRoleResponseDto.prototype, "userId", void 0);
552
+ _ts_decorate([
553
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
554
+ description: 'Role ID'
555
+ }),
556
+ _ts_metadata("design:type", String)
557
+ ], UserRoleResponseDto.prototype, "roleId", void 0);
558
+ _ts_decorate([
559
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
560
+ description: 'Role name'
561
+ }),
562
+ _ts_metadata("design:type", String)
563
+ ], UserRoleResponseDto.prototype, "roleName", void 0);
564
+ _ts_decorate([
565
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
566
+ description: 'Branch ID (null = company-wide)'
567
+ }),
568
+ _ts_metadata("design:type", Object)
569
+ ], UserRoleResponseDto.prototype, "branchId", void 0);
570
+ _ts_decorate([
571
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
572
+ description: 'When this permission was created'
573
+ }),
574
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
575
+ ], UserRoleResponseDto.prototype, "createdAt", void 0);
576
+ class RoleUserResponseDto {
577
+ id;
578
+ userId;
579
+ createdAt;
580
+ }
581
+ _ts_decorate([
582
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
583
+ description: 'Permission ID'
584
+ }),
585
+ _ts_metadata("design:type", String)
586
+ ], RoleUserResponseDto.prototype, "id", void 0);
587
+ _ts_decorate([
588
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
589
+ description: 'User ID'
590
+ }),
591
+ _ts_metadata("design:type", String)
592
+ ], RoleUserResponseDto.prototype, "userId", void 0);
593
+ _ts_decorate([
594
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
595
+ description: 'When this permission was created'
596
+ }),
597
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
598
+ ], RoleUserResponseDto.prototype, "createdAt", void 0);
599
+ class ActionUserResponseDto {
600
+ id;
601
+ userId;
602
+ createdAt;
603
+ }
604
+ _ts_decorate([
605
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
606
+ description: 'Permission ID'
607
+ }),
608
+ _ts_metadata("design:type", String)
609
+ ], ActionUserResponseDto.prototype, "id", void 0);
610
+ _ts_decorate([
611
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
612
+ description: 'User ID'
613
+ }),
614
+ _ts_metadata("design:type", String)
615
+ ], ActionUserResponseDto.prototype, "userId", void 0);
616
+ _ts_decorate([
617
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
618
+ description: 'When this permission was created'
619
+ }),
620
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
621
+ ], ActionUserResponseDto.prototype, "createdAt", void 0);
622
+ class FrontendActionDto {
623
+ code;
624
+ name;
625
+ description;
626
+ }
627
+ _ts_decorate([
628
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
629
+ description: 'Action code'
630
+ }),
631
+ _ts_metadata("design:type", String)
632
+ ], FrontendActionDto.prototype, "code", void 0);
633
+ _ts_decorate([
634
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
635
+ description: 'Action name'
636
+ }),
637
+ _ts_metadata("design:type", String)
638
+ ], FrontendActionDto.prototype, "name", void 0);
639
+ _ts_decorate([
640
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
641
+ description: 'Action description'
642
+ }),
643
+ _ts_metadata("design:type", Object)
644
+ ], FrontendActionDto.prototype, "description", void 0);
645
+ class MyPermissionsQueryDto {
646
+ parentCodes;
647
+ }
648
+ _ts_decorate([
649
+ (0,_nestjs_swagger__rspack_import_0.ApiPropertyOptional)({
650
+ description: 'Filter by parent action codes',
651
+ example: [
652
+ 'user',
653
+ 'role'
654
+ ],
655
+ type: [
656
+ String
657
+ ]
658
+ }),
659
+ (0,class_validator__rspack_import_2.IsArray)(),
660
+ (0,class_validator__rspack_import_2.IsString)({
661
+ each: true
662
+ }),
663
+ (0,class_validator__rspack_import_2.IsOptional)(),
664
+ _ts_metadata("design:type", Array)
665
+ ], MyPermissionsQueryDto.prototype, "parentCodes", void 0);
666
+ class MyPermissionsResponseDto {
667
+ frontendActions;
668
+ cachedEndpoints;
669
+ }
670
+ _ts_decorate([
671
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
672
+ type: [
673
+ FrontendActionDto
674
+ ]
675
+ }),
676
+ _ts_metadata("design:type", Array)
677
+ ], MyPermissionsResponseDto.prototype, "frontendActions", void 0);
678
+ _ts_decorate([
679
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
680
+ description: 'Number of endpoint actions cached for PermissionGuard'
681
+ }),
682
+ _ts_metadata("design:type", Number)
683
+ ], MyPermissionsResponseDto.prototype, "cachedEndpoints", void 0);
684
+ class PermissionOperationResultDto {
685
+ added;
686
+ removed;
687
+ total;
688
+ }
689
+ _ts_decorate([
690
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
691
+ description: 'Number of permissions added'
692
+ }),
693
+ _ts_metadata("design:type", Number)
694
+ ], PermissionOperationResultDto.prototype, "added", void 0);
695
+ _ts_decorate([
696
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
697
+ description: 'Number of permissions removed'
698
+ }),
699
+ _ts_metadata("design:type", Number)
700
+ ], PermissionOperationResultDto.prototype, "removed", void 0);
701
+ _ts_decorate([
702
+ (0,_nestjs_swagger__rspack_import_0.ApiProperty)({
703
+ description: 'Number of permissions requested'
704
+ }),
705
+ _ts_metadata("design:type", Number)
706
+ ], PermissionOperationResultDto.prototype, "total", void 0);
707
+
708
+ __webpack_require__.d(__webpack_exports__, {
709
+ $l: () => (RoleActionResponseDto),
710
+ A6: () => (GetRoleUsersDto),
711
+ CM: () => (GetUserActionsDto),
712
+ E4: () => (CompanyActionResponseDto),
713
+ LK: () => (UserRoleResponseDto),
714
+ MO: () => (RoleUserResponseDto),
715
+ Nx: () => (AssignCompanyActionsDto),
716
+ O_: () => (MyPermissionsQueryDto),
717
+ Q0: () => (GetUserRolesDto),
718
+ Uu: () => (PermissionItemDto),
719
+ Ww: () => (GetActionUsersDto),
720
+ Xz: () => (AssignUserRolesDto),
721
+ Yb: () => (FrontendActionDto),
722
+ Zn: () => (GetRoleActionsDto),
723
+ aG: () => (PermissionAction),
724
+ c8: () => (GetCompanyActionsDto),
725
+ cB: () => (ActionUserResponseDto),
726
+ cv: () => (AssignRoleActionsDto),
727
+ gF: () => (UserActionResponseDto),
728
+ ji: () => (MyPermissionsResponseDto),
729
+ xJ: () => (PermissionOperationResultDto),
730
+ zs: () => (AssignUserActionsDto)
731
+ });
732
+
733
+
734
+ },
735
+ 864(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
736
+ /* import */ var _flusys_nestjs_shared__rspack_import_0 = __webpack_require__(422);
737
+ /* import */ var typeorm__rspack_import_1 = __webpack_require__(158);
738
+ /* import */ var _enums_index_js__rspack_import_2 = __webpack_require__(560);
739
+ function _ts_decorate(decorators, target, key, desc) {
740
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
741
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
742
+ r = Reflect.decorate(decorators, target, key, desc);
743
+ } else {
744
+ for(var i = decorators.length - 1; i >= 0; i--){
745
+ if (d = decorators[i]) {
746
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
747
+ }
748
+ }
749
+ }
750
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
751
+ }
752
+ function _ts_metadata(metadataKey, metadataValue) {
753
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
754
+ return Reflect.metadata(metadataKey, metadataValue);
755
+ }
756
+ }
757
+
758
+
759
+
760
+ class Action extends _flusys_nestjs_shared__rspack_import_0.Identity {
761
+ readOnly;
762
+ name;
763
+ description;
764
+ code;
765
+ actionType;
766
+ permissionLogic;
767
+ serial;
768
+ isActive;
769
+ parent;
770
+ parentId;
771
+ children;
772
+ }
773
+ _ts_decorate([
774
+ (0,typeorm__rspack_import_1.Column)({
775
+ type: 'boolean',
776
+ nullable: false,
777
+ default: false,
778
+ name: 'read_only'
779
+ }),
780
+ _ts_metadata("design:type", Boolean)
781
+ ], Action.prototype, "readOnly", void 0);
782
+ _ts_decorate([
783
+ (0,typeorm__rspack_import_1.Column)({
784
+ type: 'varchar',
785
+ length: 255,
786
+ nullable: false
787
+ }),
788
+ _ts_metadata("design:type", String)
789
+ ], Action.prototype, "name", void 0);
790
+ _ts_decorate([
791
+ (0,typeorm__rspack_import_1.Column)({
792
+ type: 'varchar',
793
+ length: 500,
794
+ nullable: true
795
+ }),
796
+ _ts_metadata("design:type", Object)
797
+ ], Action.prototype, "description", void 0);
798
+ _ts_decorate([
799
+ (0,typeorm__rspack_import_1.Column)({
800
+ type: 'varchar',
801
+ length: 255,
802
+ nullable: true,
803
+ unique: true
804
+ }),
805
+ _ts_metadata("design:type", Object)
806
+ ], Action.prototype, "code", void 0);
807
+ _ts_decorate([
808
+ (0,typeorm__rspack_import_1.Column)({
809
+ type: 'varchar',
810
+ length: 50,
811
+ nullable: false,
812
+ default: 'BACKEND',
813
+ name: 'action_type'
814
+ }),
815
+ _ts_metadata("design:type", typeof _enums_index_js__rspack_import_2/* .ActionType */.X === "undefined" ? Object : _enums_index_js__rspack_import_2/* .ActionType */.X)
816
+ ], Action.prototype, "actionType", void 0);
817
+ _ts_decorate([
818
+ (0,typeorm__rspack_import_1.Column)({
819
+ type: (0,_flusys_nestjs_shared__rspack_import_0.getJsonColumnType)(),
820
+ nullable: true,
821
+ name: 'permission_logic'
822
+ }),
823
+ _ts_metadata("design:type", Object)
824
+ ], Action.prototype, "permissionLogic", void 0);
825
+ _ts_decorate([
826
+ (0,typeorm__rspack_import_1.Column)({
827
+ type: 'int',
828
+ nullable: true
829
+ }),
830
+ _ts_metadata("design:type", Object)
831
+ ], Action.prototype, "serial", void 0);
832
+ _ts_decorate([
833
+ (0,typeorm__rspack_import_1.Column)({
834
+ type: 'boolean',
835
+ nullable: false,
836
+ default: true,
837
+ name: 'is_active'
838
+ }),
839
+ _ts_metadata("design:type", Boolean)
840
+ ], Action.prototype, "isActive", void 0);
841
+ _ts_decorate([
842
+ (0,typeorm__rspack_import_1.ManyToOne)('Action', 'children', {
843
+ nullable: true,
844
+ onDelete: 'CASCADE'
845
+ }),
846
+ (0,typeorm__rspack_import_1.JoinColumn)({
847
+ name: 'parent_id'
848
+ }),
849
+ _ts_metadata("design:type", Object)
850
+ ], Action.prototype, "parent", void 0);
851
+ _ts_decorate([
852
+ (0,typeorm__rspack_import_1.Column)({
853
+ type: 'uuid',
854
+ nullable: true,
855
+ name: 'parent_id'
856
+ }),
857
+ _ts_metadata("design:type", Object)
858
+ ], Action.prototype, "parentId", void 0);
859
+ _ts_decorate([
860
+ (0,typeorm__rspack_import_1.OneToMany)('Action', 'parent'),
861
+ _ts_metadata("design:type", Array)
862
+ ], Action.prototype, "children", void 0);
863
+ Action = _ts_decorate([
864
+ (0,typeorm__rspack_import_1.Entity)({
865
+ name: 'action'
866
+ }),
867
+ (0,typeorm__rspack_import_1.Index)([
868
+ 'parentId'
869
+ ])
870
+ ], Action);
871
+
872
+ __webpack_require__.d(__webpack_exports__, {
873
+ r: () => (Action)
874
+ });
875
+
876
+
877
+ },
878
+ 423(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
879
+ /* import */ var _flusys_nestjs_shared__rspack_import_0 = __webpack_require__(422);
880
+ /* import */ var typeorm__rspack_import_1 = __webpack_require__(158);
881
+ function _ts_decorate(decorators, target, key, desc) {
882
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
883
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
884
+ r = Reflect.decorate(decorators, target, key, desc);
885
+ } else {
886
+ for(var i = decorators.length - 1; i >= 0; i--){
887
+ if (d = decorators[i]) {
888
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
889
+ }
890
+ }
891
+ }
892
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
893
+ }
894
+ function _ts_metadata(metadataKey, metadataValue) {
895
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
896
+ return Reflect.metadata(metadataKey, metadataValue);
897
+ }
898
+ }
899
+
900
+
901
+ /**
902
+ * Permission Base Entity
903
+ * Core permission fields - always included regardless of company feature
904
+ */ class PermissionBase extends _flusys_nestjs_shared__rspack_import_0.Identity {
905
+ permissionType;
906
+ sourceType;
907
+ sourceId;
908
+ targetType;
909
+ targetId;
910
+ validFrom;
911
+ validUntil;
912
+ reason;
913
+ isValid(now = new Date()) {
914
+ if (this.validFrom && now < this.validFrom) return false;
915
+ if (this.validUntil && now > this.validUntil) return false;
916
+ return true;
917
+ }
918
+ }
919
+ _ts_decorate([
920
+ (0,typeorm__rspack_import_1.Column)({
921
+ type: 'varchar',
922
+ length: 50,
923
+ name: 'permission_type'
924
+ }),
925
+ _ts_metadata("design:type", String)
926
+ ], PermissionBase.prototype, "permissionType", void 0);
927
+ _ts_decorate([
928
+ (0,typeorm__rspack_import_1.Column)({
929
+ type: 'varchar',
930
+ length: 50,
931
+ name: 'source_type'
932
+ }),
933
+ _ts_metadata("design:type", String)
934
+ ], PermissionBase.prototype, "sourceType", void 0);
935
+ _ts_decorate([
936
+ (0,typeorm__rspack_import_1.Column)({
937
+ type: 'varchar',
938
+ length: 150,
939
+ name: 'source_id'
940
+ }),
941
+ _ts_metadata("design:type", String)
942
+ ], PermissionBase.prototype, "sourceId", void 0);
943
+ _ts_decorate([
944
+ (0,typeorm__rspack_import_1.Column)({
945
+ type: 'varchar',
946
+ length: 50,
947
+ name: 'target_type'
948
+ }),
949
+ _ts_metadata("design:type", String)
950
+ ], PermissionBase.prototype, "targetType", void 0);
951
+ _ts_decorate([
952
+ (0,typeorm__rspack_import_1.Column)({
953
+ type: 'varchar',
954
+ length: 150,
955
+ name: 'target_id'
956
+ }),
957
+ _ts_metadata("design:type", String)
958
+ ], PermissionBase.prototype, "targetId", void 0);
959
+ _ts_decorate([
960
+ (0,typeorm__rspack_import_1.Column)({
961
+ type: 'timestamp',
962
+ nullable: true,
963
+ name: 'valid_from'
964
+ }),
965
+ _ts_metadata("design:type", Object)
966
+ ], PermissionBase.prototype, "validFrom", void 0);
967
+ _ts_decorate([
968
+ (0,typeorm__rspack_import_1.Column)({
969
+ type: 'timestamp',
970
+ nullable: true,
971
+ name: 'valid_until'
972
+ }),
973
+ _ts_metadata("design:type", Object)
974
+ ], PermissionBase.prototype, "validUntil", void 0);
975
+ _ts_decorate([
976
+ (0,typeorm__rspack_import_1.Column)({
977
+ type: 'text',
978
+ nullable: true
979
+ }),
980
+ _ts_metadata("design:type", Object)
981
+ ], PermissionBase.prototype, "reason", void 0);
982
+
983
+ __webpack_require__.d(__webpack_exports__, {
984
+ $: () => (PermissionBase)
985
+ });
986
+
987
+
988
+ },
989
+ 746(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
990
+ /* import */ var typeorm__rspack_import_0 = __webpack_require__(158);
991
+ /* import */ var _permission_base_entity_js__rspack_import_1 = __webpack_require__(423);
992
+ function _ts_decorate(decorators, target, key, desc) {
993
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
994
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
995
+ r = Reflect.decorate(decorators, target, key, desc);
996
+ } else {
997
+ for(var i = decorators.length - 1; i >= 0; i--){
998
+ if (d = decorators[i]) {
999
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1000
+ }
1001
+ }
1002
+ }
1003
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1004
+ }
1005
+ function _ts_metadata(metadataKey, metadataValue) {
1006
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
1007
+ return Reflect.metadata(metadataKey, metadataValue);
1008
+ }
1009
+ }
1010
+
1011
+
1012
+ class UserIamPermissionWithCompany extends _permission_base_entity_js__rspack_import_1/* .PermissionBase */.$ {
1013
+ /**
1014
+ * Company ID - Company scope for this permission
1015
+ * - null: Global permission (not company-specific)
1016
+ * - set: Permission belongs to this company
1017
+ */ companyId;
1018
+ /**
1019
+ * Branch ID - Branch scope for this permission
1020
+ * - null: Company-wide permission (all branches in company)
1021
+ * - set: Permission applies only to this specific branch
1022
+ */ branchId;
1023
+ }
1024
+ _ts_decorate([
1025
+ (0,typeorm__rspack_import_0.Column)({
1026
+ type: 'varchar',
1027
+ length: 150,
1028
+ nullable: true,
1029
+ name: 'company_id'
1030
+ }),
1031
+ _ts_metadata("design:type", Object)
1032
+ ], UserIamPermissionWithCompany.prototype, "companyId", void 0);
1033
+ _ts_decorate([
1034
+ (0,typeorm__rspack_import_0.Column)({
1035
+ type: 'varchar',
1036
+ length: 150,
1037
+ nullable: true,
1038
+ name: 'branch_id'
1039
+ }),
1040
+ _ts_metadata("design:type", Object)
1041
+ ], UserIamPermissionWithCompany.prototype, "branchId", void 0);
1042
+ UserIamPermissionWithCompany = _ts_decorate([
1043
+ (0,typeorm__rspack_import_0.Entity)({
1044
+ name: 'user_iam_permission'
1045
+ }),
1046
+ (0,typeorm__rspack_import_0.Index)([
1047
+ 'permissionType',
1048
+ 'sourceId',
1049
+ 'targetId',
1050
+ 'companyId',
1051
+ 'branchId'
1052
+ ], {
1053
+ unique: true
1054
+ }),
1055
+ (0,typeorm__rspack_import_0.Index)([
1056
+ 'sourceId',
1057
+ 'sourceType'
1058
+ ]),
1059
+ (0,typeorm__rspack_import_0.Index)([
1060
+ 'targetId',
1061
+ 'targetType'
1062
+ ]),
1063
+ (0,typeorm__rspack_import_0.Index)([
1064
+ 'permissionType'
1065
+ ]),
1066
+ (0,typeorm__rspack_import_0.Index)([
1067
+ 'companyId'
1068
+ ]),
1069
+ (0,typeorm__rspack_import_0.Index)([
1070
+ 'branchId'
1071
+ ]),
1072
+ (0,typeorm__rspack_import_0.Index)([
1073
+ 'companyId',
1074
+ 'branchId'
1075
+ ])
1076
+ ], UserIamPermissionWithCompany);
1077
+
1078
+ __webpack_require__.d(__webpack_exports__, {
1079
+ t: () => (UserIamPermissionWithCompany)
1080
+ });
1081
+
1082
+
1083
+ },
1084
+ 784(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1085
+ /* import */ var _flusys_nestjs_shared__rspack_import_0 = __webpack_require__(422);
1086
+ /* import */ var typeorm__rspack_import_1 = __webpack_require__(158);
1087
+ function _ts_decorate(decorators, target, key, desc) {
1088
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1089
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
1090
+ r = Reflect.decorate(decorators, target, key, desc);
1091
+ } else {
1092
+ for(var i = decorators.length - 1; i >= 0; i--){
1093
+ if (d = decorators[i]) {
1094
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1095
+ }
1096
+ }
1097
+ }
1098
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1099
+ }
1100
+ function _ts_metadata(metadataKey, metadataValue) {
1101
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
1102
+ return Reflect.metadata(metadataKey, metadataValue);
1103
+ }
1104
+ }
1105
+
1106
+
1107
+ class RoleBase extends _flusys_nestjs_shared__rspack_import_0.Identity {
1108
+ readOnly;
1109
+ name;
1110
+ description;
1111
+ isActive;
1112
+ serial;
1113
+ }
1114
+ _ts_decorate([
1115
+ (0,typeorm__rspack_import_1.Column)({
1116
+ type: 'boolean',
1117
+ nullable: false,
1118
+ default: false,
1119
+ name: 'read_only'
1120
+ }),
1121
+ _ts_metadata("design:type", Boolean)
1122
+ ], RoleBase.prototype, "readOnly", void 0);
1123
+ _ts_decorate([
1124
+ (0,typeorm__rspack_import_1.Column)({
1125
+ type: 'varchar',
1126
+ length: 255,
1127
+ nullable: false
1128
+ }),
1129
+ _ts_metadata("design:type", String)
1130
+ ], RoleBase.prototype, "name", void 0);
1131
+ _ts_decorate([
1132
+ (0,typeorm__rspack_import_1.Column)({
1133
+ type: 'varchar',
1134
+ length: 500,
1135
+ nullable: true
1136
+ }),
1137
+ _ts_metadata("design:type", Object)
1138
+ ], RoleBase.prototype, "description", void 0);
1139
+ _ts_decorate([
1140
+ (0,typeorm__rspack_import_1.Column)({
1141
+ type: 'boolean',
1142
+ nullable: false,
1143
+ default: true,
1144
+ name: 'is_active'
1145
+ }),
1146
+ _ts_metadata("design:type", Boolean)
1147
+ ], RoleBase.prototype, "isActive", void 0);
1148
+ _ts_decorate([
1149
+ (0,typeorm__rspack_import_1.Column)({
1150
+ type: 'int',
1151
+ nullable: true
1152
+ }),
1153
+ _ts_metadata("design:type", Object)
1154
+ ], RoleBase.prototype, "serial", void 0);
1155
+
1156
+ __webpack_require__.d(__webpack_exports__, {
1157
+ u: () => (RoleBase)
1158
+ });
1159
+
1160
+
1161
+ },
1162
+ 353(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1163
+ /* import */ var typeorm__rspack_import_0 = __webpack_require__(158);
1164
+ /* import */ var _role_base_entity_js__rspack_import_1 = __webpack_require__(784);
1165
+ function _ts_decorate(decorators, target, key, desc) {
1166
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1167
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
1168
+ r = Reflect.decorate(decorators, target, key, desc);
1169
+ } else {
1170
+ for(var i = decorators.length - 1; i >= 0; i--){
1171
+ if (d = decorators[i]) {
1172
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1173
+ }
1174
+ }
1175
+ }
1176
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1177
+ }
1178
+ function _ts_metadata(metadataKey, metadataValue) {
1179
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
1180
+ return Reflect.metadata(metadataKey, metadataValue);
1181
+ }
1182
+ }
1183
+
1184
+
1185
+ class RoleWithCompany extends _role_base_entity_js__rspack_import_1/* .RoleBase */.u {
1186
+ companyId;
1187
+ }
1188
+ _ts_decorate([
1189
+ (0,typeorm__rspack_import_0.Column)({
1190
+ type: 'uuid',
1191
+ nullable: true,
1192
+ name: 'company_id'
1193
+ }),
1194
+ _ts_metadata("design:type", Object)
1195
+ ], RoleWithCompany.prototype, "companyId", void 0);
1196
+ RoleWithCompany = _ts_decorate([
1197
+ (0,typeorm__rspack_import_0.Entity)({
1198
+ name: 'role'
1199
+ }),
1200
+ (0,typeorm__rspack_import_0.Index)([
1201
+ 'companyId'
1202
+ ])
1203
+ ], RoleWithCompany);
1204
+
1205
+ __webpack_require__.d(__webpack_exports__, {
1206
+ g: () => (RoleWithCompany)
1207
+ });
1208
+
1209
+
1210
+ },
1211
+ 326(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1212
+ /* import */ var typeorm__rspack_import_0 = __webpack_require__(158);
1213
+ /* import */ var _role_base_entity_js__rspack_import_1 = __webpack_require__(784);
1214
+ function _ts_decorate(decorators, target, key, desc) {
1215
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1216
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
1217
+ r = Reflect.decorate(decorators, target, key, desc);
1218
+ } else {
1219
+ for(var i = decorators.length - 1; i >= 0; i--){
1220
+ if (d = decorators[i]) {
1221
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1222
+ }
1223
+ }
1224
+ }
1225
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1226
+ }
1227
+
1228
+
1229
+ class Role extends _role_base_entity_js__rspack_import_1/* .RoleBase */.u {
1230
+ }
1231
+ Role = _ts_decorate([
1232
+ (0,typeorm__rspack_import_0.Entity)({
1233
+ name: 'role'
1234
+ })
1235
+ ], Role);
1236
+
1237
+ __webpack_require__.d(__webpack_exports__, {
1238
+ X: () => (Role)
1239
+ });
1240
+
1241
+
1242
+ },
1243
+ 489(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1244
+ /* import */ var typeorm__rspack_import_0 = __webpack_require__(158);
1245
+ /* import */ var _permission_base_entity_js__rspack_import_1 = __webpack_require__(423);
1246
+ function _ts_decorate(decorators, target, key, desc) {
1247
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1248
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
1249
+ r = Reflect.decorate(decorators, target, key, desc);
1250
+ } else {
1251
+ for(var i = decorators.length - 1; i >= 0; i--){
1252
+ if (d = decorators[i]) {
1253
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1254
+ }
1255
+ }
1256
+ }
1257
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1258
+ }
1259
+
1260
+
1261
+ class UserIamPermission extends _permission_base_entity_js__rspack_import_1/* .PermissionBase */.$ {
1262
+ }
1263
+ UserIamPermission = _ts_decorate([
1264
+ (0,typeorm__rspack_import_0.Entity)({
1265
+ name: 'user_iam_permission'
1266
+ }),
1267
+ (0,typeorm__rspack_import_0.Index)([
1268
+ 'permissionType',
1269
+ 'sourceId',
1270
+ 'targetId'
1271
+ ], {
1272
+ unique: true
1273
+ }),
1274
+ (0,typeorm__rspack_import_0.Index)([
1275
+ 'sourceId',
1276
+ 'sourceType'
1277
+ ]),
1278
+ (0,typeorm__rspack_import_0.Index)([
1279
+ 'targetId',
1280
+ 'targetType'
1281
+ ]),
1282
+ (0,typeorm__rspack_import_0.Index)([
1283
+ 'permissionType'
1284
+ ])
1285
+ ], UserIamPermission);
1286
+
1287
+ __webpack_require__.d(__webpack_exports__, {
1288
+ y: () => (UserIamPermission)
1289
+ });
1290
+
1291
+
1292
+ },
1293
+ 560(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1294
+ /**
1295
+ * ActionType Enum - Categorizes actions by their usage context
1296
+ *
1297
+ * - BACKEND: Actions for API endpoint permissions (cached for PermissionGuard)
1298
+ * - FRONTEND: Actions for frontend features (returned in my-permissions API)
1299
+ * - BOTH: Actions used for both backend and frontend (cached + returned)
1300
+ */ var ActionType = /*#__PURE__*/ function(ActionType) {
1301
+ ActionType["BACKEND"] = "backend";
1302
+ ActionType["FRONTEND"] = "frontend";
1303
+ ActionType["BOTH"] = "both";
1304
+ return ActionType;
1305
+ }({});
1306
+
1307
+ __webpack_require__.d(__webpack_exports__, {
1308
+ X: () => (ActionType)
1309
+ });
1310
+
1311
+
1312
+ },
1313
+ 85(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1314
+ var IamEntityType = /*#__PURE__*/ function(IamEntityType) {
1315
+ IamEntityType["USER"] = "user";
1316
+ IamEntityType["ROLE"] = "role";
1317
+ IamEntityType["ACTION"] = "action";
1318
+ IamEntityType["COMPANY"] = "company";
1319
+ return IamEntityType;
1320
+ }({});
1321
+
1322
+ __webpack_require__.d(__webpack_exports__, {
1323
+ n: () => (IamEntityType)
1324
+ });
1325
+
1326
+
1327
+ },
1328
+ 517(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1329
+ var IamPermissionType = /*#__PURE__*/ function(IamPermissionType) {
1330
+ IamPermissionType["USER_ROLE"] = "user_role";
1331
+ IamPermissionType["ROLE_ACTION"] = "role_action";
1332
+ IamPermissionType["USER_ACTION"] = "user_action";
1333
+ IamPermissionType["COMPANY_ACTION"] = "company_action";
1334
+ return IamPermissionType;
1335
+ }({});
1336
+
1337
+ __webpack_require__.d(__webpack_exports__, {
1338
+ V: () => (IamPermissionType)
1339
+ });
1340
+
1341
+
1342
+ },
1343
+ 841(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1344
+ var IAMPermissionMode = /*#__PURE__*/ function(IAMPermissionMode) {
1345
+ IAMPermissionMode[IAMPermissionMode["RBAC"] = 1] = "RBAC";
1346
+ IAMPermissionMode[IAMPermissionMode["DIRECT"] = 2] = "DIRECT";
1347
+ IAMPermissionMode[IAMPermissionMode["FULL"] = 3] = "FULL";
1348
+ return IAMPermissionMode;
1349
+ }({});
1350
+
1351
+ __webpack_require__.d(__webpack_exports__, {
1352
+ w: () => (IAMPermissionMode)
1353
+ });
1354
+
1355
+
1356
+ },
1357
+ 674(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1358
+
1359
+ // EXPORTS
1360
+ __webpack_require__.d(__webpack_exports__, {
1361
+ T: () => (/* reexport */ PermissionModeHelper),
1362
+ u: () => (/* reexport */ validateCompanyAccess)
1363
+ });
1364
+
1365
+ // EXTERNAL MODULE: external "@nestjs/common"
1366
+ var common_ = __webpack_require__(157);
1367
+ ;// CONCATENATED MODULE: external "@flusys/nestjs-shared/constants"
1368
+
1369
+ ;// CONCATENATED MODULE: ./projects/nestjs-iam/src/helpers/company-access.helper.ts
1370
+
1371
+
1372
+ /**
1373
+ * Validates that user has access to the specified company.
1374
+ * Used for user-action and role-permission operations when company feature is enabled.
1375
+ *
1376
+ * @throws ForbiddenException if user doesn't have access to the company
1377
+ */ function validateCompanyAccess(config, companyId, user, errorMessage = 'You do not have access to this company', messageKey = AUTH_MESSAGES.COMPANY_NO_ACCESS) {
1378
+ if (!config.isCompanyFeatureEnabled() || !companyId) {
1379
+ return;
1380
+ }
1381
+ if (user.companyId !== companyId) {
1382
+ throw new common_.ForbiddenException({
1383
+ message: errorMessage,
1384
+ messageKey
1385
+ });
1386
+ }
1387
+ }
1388
+
1389
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/enums/permission-type.enum.ts
1390
+ var permission_type_enum = __webpack_require__(841);
1391
+ ;// CONCATENATED MODULE: ./projects/nestjs-iam/src/helpers/permission-mode.helper.ts
1392
+
1393
+ /**
1394
+ * Helper for converting permission mode strings to enum values
1395
+ *
1396
+ * **Purpose:** Centralize the conversion logic from IBootstrapAppConfig.permissionMode
1397
+ * (string) to IAMPermissionMode enum to prevent duplication and sync issues.
1398
+ *
1399
+ * **Used by:**
1400
+ * - iam.module.ts (forRoot, forRootAsync)
1401
+ * - iam-config.service.ts (getPermissionMode)
1402
+ * - main.ts (Swagger setup)
1403
+ */ class PermissionModeHelper {
1404
+ /**
1405
+ * Convert permission mode string to enum value
1406
+ *
1407
+ * @param modeStr - Permission mode string ('FULL', 'RBAC', 'DIRECT')
1408
+ * @returns IAMPermissionMode enum value
1409
+ * @default IAMPermissionMode.FULL if invalid/missing
1410
+ *
1411
+ * @example
1412
+ * ```typescript
1413
+ * const mode = PermissionModeHelper.fromString('RBAC');
1414
+ * // Returns: IAMPermissionMode.RBAC
1415
+ *
1416
+ * const mode = PermissionModeHelper.fromString(undefined);
1417
+ * // Returns: IAMPermissionMode.FULL (default)
1418
+ * ```
1419
+ */ static fromString(modeStr) {
1420
+ if (!modeStr) {
1421
+ return permission_type_enum/* .IAMPermissionMode.FULL */.w.FULL;
1422
+ }
1423
+ const mode = permission_type_enum/* .IAMPermissionMode */.w[modeStr];
1424
+ return mode ?? permission_type_enum/* .IAMPermissionMode.FULL */.w.FULL;
1425
+ }
1426
+ /**
1427
+ * Convert enum value to string (for serialization/logging)
1428
+ *
1429
+ * @param mode - IAMPermissionMode enum value
1430
+ * @returns String representation
1431
+ *
1432
+ * @example
1433
+ * ```typescript
1434
+ * const str = PermissionModeHelper.toString(IAMPermissionMode.RBAC);
1435
+ * // Returns: 'RBAC'
1436
+ * ```
1437
+ */ static toString(mode) {
1438
+ return permission_type_enum/* .IAMPermissionMode */.w[mode];
1439
+ }
1440
+ }
1441
+
1442
+ ;// CONCATENATED MODULE: ./projects/nestjs-iam/src/helpers/index.ts
1443
+
1444
+
1445
+
1446
+
1447
+ },
1448
+ 713(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1449
+ /* import */ var _flusys_nestjs_shared_classes__rspack_import_0 = __webpack_require__(937);
1450
+ /* import */ var _flusys_nestjs_shared_modules__rspack_import_1 = __webpack_require__(236);
1451
+ /* import */ var _nestjs_common__rspack_import_2 = __webpack_require__(157);
1452
+ /* import */ var typeorm__rspack_import_3 = __webpack_require__(158);
1453
+ /* import */ var _config_index_js__rspack_import_11 = __webpack_require__(916);
1454
+ /* import */ var _config_index_js__rspack_import_12 = __webpack_require__(490);
1455
+ /* import */ var _entities_action_entity_js__rspack_import_4 = __webpack_require__(864);
1456
+ /* import */ var _entities_permission_with_company_entity_js__rspack_import_5 = __webpack_require__(746);
1457
+ /* import */ var _entities_user_iam_permission_entity_js__rspack_import_6 = __webpack_require__(489);
1458
+ /* import */ var _enums_iam_entity_type_enum_js__rspack_import_14 = __webpack_require__(85);
1459
+ /* import */ var _enums_iam_permission_type_enum_js__rspack_import_13 = __webpack_require__(517);
1460
+ /* import */ var _iam_config_service_js__rspack_import_7 = __webpack_require__(645);
1461
+ /* import */ var _iam_datasource_service_js__rspack_import_8 = __webpack_require__(831);
1462
+ /* import */ var _permission_cache_service_js__rspack_import_9 = __webpack_require__(99);
1463
+ /* import */ var _permission_service_js__rspack_import_10 = __webpack_require__(472);
1464
+ function _ts_decorate(decorators, target, key, desc) {
1465
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1466
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
1467
+ r = Reflect.decorate(decorators, target, key, desc);
1468
+ } else {
1469
+ for(var i = decorators.length - 1; i >= 0; i--){
1470
+ if (d = decorators[i]) {
1471
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1472
+ }
1473
+ }
1474
+ }
1475
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1476
+ }
1477
+ function _ts_metadata(metadataKey, metadataValue) {
1478
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
1479
+ return Reflect.metadata(metadataKey, metadataValue);
1480
+ }
1481
+ }
1482
+ function _ts_param(paramIndex, decorator) {
1483
+ return function(target, key) {
1484
+ decorator(target, key, paramIndex);
1485
+ };
1486
+ }
1487
+
1488
+
1489
+
1490
+
1491
+
1492
+
1493
+
1494
+
1495
+
1496
+
1497
+
1498
+
1499
+
1500
+
1501
+ class ActionService extends _flusys_nestjs_shared_classes__rspack_import_0.ApiService {
1502
+ cacheManager;
1503
+ utilsService;
1504
+ iamConfigService;
1505
+ permissionService;
1506
+ permissionCacheService;
1507
+ constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionService, permissionCacheService){
1508
+ super(_config_index_js__rspack_import_11/* .IAM_EVENT_ENTITIES.ACTION */.H.ACTION, cacheManager, utilsService, ActionService.name, true, (/* inlined export .IAM_EVENT_MODULE */"iam"), dataSourceProvider, _entities_action_entity_js__rspack_import_4/* .Action */.r), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionService = permissionService, this.permissionCacheService = permissionCacheService;
1509
+ }
1510
+ async beforeUpdateOperation(dto, _user, _queryRunner) {
1511
+ const dtos = Array.isArray(dto) ? dto : [
1512
+ dto
1513
+ ];
1514
+ const ids = dtos.map((d)=>d.id);
1515
+ await this.ensureDataSourceRepository();
1516
+ const readonlyActions = await this.repository.find({
1517
+ where: {
1518
+ id: (0,typeorm__rspack_import_3.In)(ids),
1519
+ readOnly: true,
1520
+ deletedAt: (0,typeorm__rspack_import_3.IsNull)()
1521
+ }
1522
+ });
1523
+ if (readonlyActions.length > 0) {
1524
+ const names = readonlyActions.map((a)=>a.name).join(', ');
1525
+ throw new _nestjs_common__rspack_import_2.ForbiddenException({
1526
+ message: `Cannot modify readonly action(s): ${names}`,
1527
+ messageKey: _config_index_js__rspack_import_12/* .ACTION_MESSAGES.READONLY_UPDATE_FORBIDDEN */.Q$.READONLY_UPDATE_FORBIDDEN,
1528
+ messageVariables: {
1529
+ names
1530
+ }
1531
+ });
1532
+ }
1533
+ }
1534
+ async beforeDeleteOperation(dto, user, queryRunner) {
1535
+ const actionIds = Array.isArray(dto.id) ? dto.id : [
1536
+ dto.id
1537
+ ];
1538
+ if (actionIds.length === 0) {
1539
+ return;
1540
+ }
1541
+ await this.ensureDataSourceRepository();
1542
+ const readonlyActions = await this.repository.find({
1543
+ where: {
1544
+ id: (0,typeorm__rspack_import_3.In)(actionIds),
1545
+ readOnly: true,
1546
+ deletedAt: (0,typeorm__rspack_import_3.IsNull)()
1547
+ }
1548
+ });
1549
+ if (readonlyActions.length > 0) {
1550
+ const names = readonlyActions.map((a)=>a.name).join(', ');
1551
+ throw new _nestjs_common__rspack_import_2.ForbiddenException({
1552
+ message: `Cannot delete readonly action(s): ${names}`,
1553
+ messageKey: _config_index_js__rspack_import_12/* .ACTION_MESSAGES.READONLY_DELETE_FORBIDDEN */.Q$.READONLY_DELETE_FORBIDDEN,
1554
+ messageVariables: {
1555
+ names
1556
+ }
1557
+ });
1558
+ }
1559
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
1560
+ const permissionEntity = enableCompanyFeature ? _entities_permission_with_company_entity_js__rspack_import_5/* .UserIamPermissionWithCompany */.t : _entities_user_iam_permission_entity_js__rspack_import_6/* .UserIamPermission */.y;
1561
+ const permissionRepo = queryRunner.manager.getRepository(permissionEntity);
1562
+ const [roleActionRows, userActionRows, companyActionRows] = await Promise.all([
1563
+ permissionRepo.find({
1564
+ where: {
1565
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_13/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
1566
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ROLE */.n.ROLE,
1567
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ACTION */.n.ACTION,
1568
+ targetId: (0,typeorm__rspack_import_3.In)(actionIds)
1569
+ }
1570
+ }),
1571
+ permissionRepo.find({
1572
+ where: {
1573
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_13/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
1574
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ACTION */.n.ACTION,
1575
+ targetId: (0,typeorm__rspack_import_3.In)(actionIds)
1576
+ }
1577
+ }),
1578
+ enableCompanyFeature ? permissionRepo.find({
1579
+ where: {
1580
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_13/* .IamPermissionType.COMPANY_ACTION */.V.COMPANY_ACTION,
1581
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.COMPANY */.n.COMPANY,
1582
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ACTION */.n.ACTION,
1583
+ targetId: (0,typeorm__rspack_import_3.In)(actionIds)
1584
+ }
1585
+ }) : Promise.resolve([])
1586
+ ]);
1587
+ const affectedUserIds = new Set(userActionRows.map((row)=>row.sourceId));
1588
+ const affectedCompanyIds = [
1589
+ ...new Set(companyActionRows.map((row)=>row.sourceId).filter((id)=>!!id))
1590
+ ];
1591
+ const affectedRoleIds = [
1592
+ ...new Set(roleActionRows.map((row)=>row.sourceId))
1593
+ ];
1594
+ if (affectedRoleIds.length > 0) {
1595
+ const userRoleRows = await permissionRepo.find({
1596
+ where: {
1597
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_13/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
1598
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ROLE */.n.ROLE,
1599
+ targetId: (0,typeorm__rspack_import_3.In)(affectedRoleIds)
1600
+ }
1601
+ });
1602
+ userRoleRows.forEach((row)=>affectedUserIds.add(row.sourceId));
1603
+ }
1604
+ await permissionRepo.delete({
1605
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_13/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
1606
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ACTION */.n.ACTION,
1607
+ targetId: (0,typeorm__rspack_import_3.In)(actionIds)
1608
+ });
1609
+ await permissionRepo.delete({
1610
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_13/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
1611
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ACTION */.n.ACTION,
1612
+ targetId: (0,typeorm__rspack_import_3.In)(actionIds)
1613
+ });
1614
+ await permissionRepo.delete({
1615
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_13/* .IamPermissionType.COMPANY_ACTION */.V.COMPANY_ACTION,
1616
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.COMPANY */.n.COMPANY,
1617
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_14/* .IamEntityType.ACTION */.n.ACTION,
1618
+ targetId: (0,typeorm__rspack_import_3.In)(actionIds)
1619
+ });
1620
+ await Promise.all([
1621
+ affectedUserIds.size > 0 ? this.permissionCacheService.invalidateUsers([
1622
+ ...affectedUserIds
1623
+ ]) : Promise.resolve(),
1624
+ ...affectedCompanyIds.map((companyId)=>this.permissionCacheService.invalidateCompanyMembersCache(companyId))
1625
+ ]);
1626
+ }
1627
+ // Query Customization
1628
+ async getSelectQuery(query, _user, select) {
1629
+ if (!select?.length) {
1630
+ select = [
1631
+ 'id',
1632
+ 'name',
1633
+ 'code',
1634
+ 'description',
1635
+ 'actionType',
1636
+ 'permissionLogic',
1637
+ 'isActive',
1638
+ 'readOnly',
1639
+ 'parentId',
1640
+ 'serial',
1641
+ 'createdAt'
1642
+ ];
1643
+ }
1644
+ query.select(select.map((f)=>`${this.entityName}.${f}`));
1645
+ return {
1646
+ query,
1647
+ isRaw: false
1648
+ };
1649
+ }
1650
+ async getGlobalSearchQuery(query, search) {
1651
+ query.andWhere('(action.name LIKE :search OR action.code LIKE :search OR action.description LIKE :search)', {
1652
+ search: `%${search}%`
1653
+ });
1654
+ return {
1655
+ query,
1656
+ isRaw: false
1657
+ };
1658
+ }
1659
+ // Response Conversion
1660
+ convertEntityToResponseDto(entity, _isRaw) {
1661
+ return {
1662
+ id: entity.id,
1663
+ readOnly: entity.readOnly,
1664
+ name: entity.name,
1665
+ description: entity.description,
1666
+ code: entity.code,
1667
+ actionType: entity.actionType,
1668
+ permissionLogic: entity.permissionLogic,
1669
+ serial: entity.serial,
1670
+ isActive: entity.isActive,
1671
+ parentId: entity.parentId,
1672
+ createdAt: entity.createdAt,
1673
+ updatedAt: entity.updatedAt,
1674
+ deletedAt: entity.deletedAt,
1675
+ createdById: entity.createdById,
1676
+ updatedById: entity.updatedById,
1677
+ deletedById: entity.deletedById
1678
+ };
1679
+ }
1680
+ // Custom Methods
1681
+ actionSelectFields = [
1682
+ 'id',
1683
+ 'code',
1684
+ 'name',
1685
+ 'description',
1686
+ 'actionType',
1687
+ 'permissionLogic',
1688
+ 'isActive',
1689
+ 'parentId',
1690
+ 'serial'
1691
+ ];
1692
+ requireUser(user, methodName) {
1693
+ if (!user) {
1694
+ throw new _nestjs_common__rspack_import_2.BadRequestException({
1695
+ message: `User is required for ${methodName}`,
1696
+ messageKey: _config_index_js__rspack_import_12/* .PERMISSION_OPERATION_MESSAGES.USER_REQUIRED */.P3.USER_REQUIRED,
1697
+ messageVariables: {
1698
+ method: methodName
1699
+ }
1700
+ });
1701
+ }
1702
+ }
1703
+ /** Get actions available for permission assignment (filtered by company whitelist) */ async getActionsForPermission(user, companyId) {
1704
+ await this.ensureDataSourceRepository();
1705
+ this.requireUser(user, 'getActionsForPermission');
1706
+ let whereClause = {};
1707
+ const targetCompanyId = companyId || user.companyId;
1708
+ if (this.iamConfigService.isCompanyFeatureEnabled() && targetCompanyId) {
1709
+ const companyActionIds = await this.permissionService.getCompanyActions(targetCompanyId, true);
1710
+ if (companyActionIds.length === 0) {
1711
+ return [];
1712
+ }
1713
+ whereClause = {
1714
+ id: (0,typeorm__rspack_import_3.In)(companyActionIds)
1715
+ };
1716
+ }
1717
+ const actions = await this.repository.find({
1718
+ where: whereClause,
1719
+ select: this.actionSelectFields
1720
+ });
1721
+ return actions.map((action)=>this.convertEntityToResponseDto(action, false));
1722
+ }
1723
+ /** Get actions in hierarchical tree structure */ async getActionTree(user, search, isActive, withDeleted = false) {
1724
+ await this.ensureDataSourceRepository();
1725
+ this.requireUser(user, 'getActionTree');
1726
+ const query = this.repository.createQueryBuilder('action');
1727
+ if (!withDeleted) {
1728
+ query.andWhere('action.deletedAt IS NULL');
1729
+ }
1730
+ if (isActive !== undefined) {
1731
+ query.andWhere('action.isActive = :isActive', {
1732
+ isActive
1733
+ });
1734
+ }
1735
+ if (search?.trim()) {
1736
+ query.andWhere('(action.name LIKE :search OR action.code LIKE :search)', {
1737
+ search: `%${search.trim()}%`
1738
+ });
1739
+ }
1740
+ const actions = await query.orderBy('action.serial', 'ASC').getMany();
1741
+ return this.buildActionTree(actions);
1742
+ }
1743
+ buildActionTree(actions) {
1744
+ if (!actions?.length) {
1745
+ return [];
1746
+ }
1747
+ const map = new Map();
1748
+ const rootNodes = [];
1749
+ for (const action of actions){
1750
+ const treeNode = {
1751
+ ...this.convertEntityToResponseDto(action, false),
1752
+ children: []
1753
+ };
1754
+ map.set(action.id, treeNode);
1755
+ }
1756
+ for (const action of actions){
1757
+ const node = map.get(action.id);
1758
+ if (!node) {
1759
+ continue;
1760
+ }
1761
+ if (action.parentId && map.has(action.parentId)) {
1762
+ const parent = map.get(action.parentId);
1763
+ if (parent?.children) {
1764
+ parent.children.push(node);
1765
+ }
1766
+ } else {
1767
+ rootNodes.push(node);
1768
+ }
1769
+ }
1770
+ return rootNodes;
1771
+ }
1772
+ }
1773
+ ActionService = _ts_decorate([
1774
+ (0,_nestjs_common__rspack_import_2.Injectable)({
1775
+ scope: _nestjs_common__rspack_import_2.Scope.REQUEST
1776
+ }),
1777
+ _ts_param(0, (0,_nestjs_common__rspack_import_2.Inject)('CACHE_INSTANCE')),
1778
+ _ts_param(1, (0,_nestjs_common__rspack_import_2.Inject)(_flusys_nestjs_shared_modules__rspack_import_1.UtilsService)),
1779
+ _ts_param(2, (0,_nestjs_common__rspack_import_2.Inject)(_iam_config_service_js__rspack_import_7/* .IAMConfigService */.N)),
1780
+ _ts_param(3, (0,_nestjs_common__rspack_import_2.Inject)(_iam_datasource_service_js__rspack_import_8/* .IAMDataSourceService */.U)),
1781
+ _ts_param(4, (0,_nestjs_common__rspack_import_2.Inject)(_permission_service_js__rspack_import_10/* .PermissionService */.n)),
1782
+ _ts_param(5, (0,_nestjs_common__rspack_import_2.Inject)(_permission_cache_service_js__rspack_import_9/* .PermissionCacheService */.D)),
1783
+ _ts_metadata("design:type", Function),
1784
+ _ts_metadata("design:paramtypes", [
1785
+ typeof _flusys_nestjs_shared_classes__rspack_import_0.HybridCache === "undefined" ? Object : _flusys_nestjs_shared_classes__rspack_import_0.HybridCache,
1786
+ typeof _flusys_nestjs_shared_modules__rspack_import_1.UtilsService === "undefined" ? Object : _flusys_nestjs_shared_modules__rspack_import_1.UtilsService,
1787
+ typeof _iam_config_service_js__rspack_import_7/* .IAMConfigService */.N === "undefined" ? Object : _iam_config_service_js__rspack_import_7/* .IAMConfigService */.N,
1788
+ typeof _iam_datasource_service_js__rspack_import_8/* .IAMDataSourceService */.U === "undefined" ? Object : _iam_datasource_service_js__rspack_import_8/* .IAMDataSourceService */.U,
1789
+ typeof _permission_service_js__rspack_import_10/* .PermissionService */.n === "undefined" ? Object : _permission_service_js__rspack_import_10/* .PermissionService */.n,
1790
+ typeof _permission_cache_service_js__rspack_import_9/* .PermissionCacheService */.D === "undefined" ? Object : _permission_cache_service_js__rspack_import_9/* .PermissionCacheService */.D
1791
+ ])
1792
+ ], ActionService);
1793
+
1794
+ __webpack_require__.d(__webpack_exports__, {
1795
+ u: () => (ActionService)
1796
+ });
1797
+
1798
+
1799
+ },
1800
+ 645(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1801
+ /* import */ var _nestjs_common__rspack_import_0 = __webpack_require__(157);
1802
+ /* import */ var _config_iam_constants_js__rspack_import_3 = __webpack_require__(180);
1803
+ /* import */ var _enums_permission_type_enum_js__rspack_import_2 = __webpack_require__(841);
1804
+ /* import */ var _helpers_index_js__rspack_import_1 = __webpack_require__(674);
1805
+ function _ts_decorate(decorators, target, key, desc) {
1806
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1807
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
1808
+ r = Reflect.decorate(decorators, target, key, desc);
1809
+ } else {
1810
+ for(var i = decorators.length - 1; i >= 0; i--){
1811
+ if (d = decorators[i]) {
1812
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1813
+ }
1814
+ }
1815
+ }
1816
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1817
+ }
1818
+ function _ts_metadata(metadataKey, metadataValue) {
1819
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
1820
+ return Reflect.metadata(metadataKey, metadataValue);
1821
+ }
1822
+ }
1823
+ function _ts_param(paramIndex, decorator) {
1824
+ return function(target, key) {
1825
+ decorator(target, key, paramIndex);
1826
+ };
1827
+ }
1828
+
1829
+
1830
+
1831
+
1832
+ class IAMConfigService {
1833
+ options;
1834
+ constructor(injectedOptions){
1835
+ this.options = injectedOptions ?? {
1836
+ global: false,
1837
+ includeController: false
1838
+ };
1839
+ }
1840
+ // Database Mode
1841
+ getDatabaseMode() {
1842
+ return this.options.bootstrapAppConfig?.databaseMode ?? 'single';
1843
+ }
1844
+ isMultiTenant() {
1845
+ return this.getDatabaseMode() === 'multi-tenant';
1846
+ }
1847
+ // Feature Flags
1848
+ isCompanyFeatureEnabled() {
1849
+ return this.options.bootstrapAppConfig?.enableCompanyFeature ?? false;
1850
+ }
1851
+ // Permission Mode
1852
+ getPermissionMode() {
1853
+ return _helpers_index_js__rspack_import_1/* .PermissionModeHelper.fromString */.T.fromString(this.options.bootstrapAppConfig?.permissionMode);
1854
+ }
1855
+ isRbacEnabled() {
1856
+ const mode = this.getPermissionMode();
1857
+ return mode === _enums_permission_type_enum_js__rspack_import_2/* .IAMPermissionMode.RBAC */.w.RBAC || mode === _enums_permission_type_enum_js__rspack_import_2/* .IAMPermissionMode.FULL */.w.FULL;
1858
+ }
1859
+ isDirectPermissionEnabled() {
1860
+ const mode = this.getPermissionMode();
1861
+ return mode === _enums_permission_type_enum_js__rspack_import_2/* .IAMPermissionMode.DIRECT */.w.DIRECT || mode === _enums_permission_type_enum_js__rspack_import_2/* .IAMPermissionMode.FULL */.w.FULL;
1862
+ }
1863
+ // Options
1864
+ getOptions() {
1865
+ return this.options;
1866
+ }
1867
+ }
1868
+ IAMConfigService = _ts_decorate([
1869
+ (0,_nestjs_common__rspack_import_0.Injectable)(),
1870
+ _ts_param(0, (0,_nestjs_common__rspack_import_0.Optional)()),
1871
+ _ts_param(0, (0,_nestjs_common__rspack_import_0.Inject)(_config_iam_constants_js__rspack_import_3/* .IAM_MODULE_OPTIONS */.G)),
1872
+ _ts_metadata("design:type", Function),
1873
+ _ts_metadata("design:paramtypes", [
1874
+ typeof IAMModuleOptions === "undefined" ? Object : IAMModuleOptions
1875
+ ])
1876
+ ], IAMConfigService);
1877
+
1878
+ __webpack_require__.d(__webpack_exports__, {
1879
+ N: () => (IAMConfigService)
1880
+ });
1881
+
1882
+
1883
+ },
1884
+ 831(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1885
+
1886
+ // EXPORTS
1887
+ __webpack_require__.d(__webpack_exports__, {
1888
+ U: () => (/* binding */ IAMDataSourceService)
1889
+ });
1890
+
1891
+ // EXTERNAL MODULE: external "@flusys/nestjs-shared/modules"
1892
+ var modules_ = __webpack_require__(236);
1893
+ // EXTERNAL MODULE: external "@nestjs/common"
1894
+ var common_ = __webpack_require__(157);
1895
+ ;// CONCATENATED MODULE: external "@nestjs/core"
1896
+
1897
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/helpers/index.ts + 3 modules
1898
+ var helpers = __webpack_require__(674);
1899
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/services/iam-config.service.ts
1900
+ var iam_config_service = __webpack_require__(645);
1901
+ ;// CONCATENATED MODULE: ./projects/nestjs-iam/src/services/iam-datasource.service.ts
1902
+ function _ts_decorate(decorators, target, key, desc) {
1903
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1904
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
1905
+ r = Reflect.decorate(decorators, target, key, desc);
1906
+ } else {
1907
+ for(var i = decorators.length - 1; i >= 0; i--){
1908
+ if (d = decorators[i]) {
1909
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1910
+ }
1911
+ }
1912
+ }
1913
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
1914
+ }
1915
+ function _ts_metadata(metadataKey, metadataValue) {
1916
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
1917
+ return Reflect.metadata(metadataKey, metadataValue);
1918
+ }
1919
+ }
1920
+ function _ts_param(paramIndex, decorator) {
1921
+ return function(target, key) {
1922
+ decorator(target, key, paramIndex);
1923
+ };
1924
+ }
1925
+
1926
+
1927
+
1928
+
1929
+
1930
+ class IAMDataSourceService extends modules_.MultiTenantDataSourceService {
1931
+ configService;
1932
+ static tenantConnections = new Map();
1933
+ static singleDataSource = null;
1934
+ static tenantsRegistry = new Map();
1935
+ static initialized = false;
1936
+ static connectionLocks = new Map();
1937
+ static singleConnectionLock = null;
1938
+ constructor(configService, request){
1939
+ super(IAMDataSourceService.buildParentOptions(configService.getOptions()), request), this.configService = configService;
1940
+ }
1941
+ static buildParentOptions(options) {
1942
+ return {
1943
+ bootstrapAppConfig: options.bootstrapAppConfig,
1944
+ defaultDatabaseConfig: options.config?.defaultDatabaseConfig,
1945
+ tenantDefaultDatabaseConfig: options.config?.tenantDefaultDatabaseConfig,
1946
+ tenants: options.config?.tenants
1947
+ };
1948
+ }
1949
+ getEnableCompanyFeatureForTenant(tenant) {
1950
+ return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
1951
+ }
1952
+ async getIAMEntities() {
1953
+ const { getIAMEntitiesByConfig } = await __webpack_require__.e(/* import() */ 364).then(__webpack_require__.bind(__webpack_require__, 743));
1954
+ const enableCompanyFeature = this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
1955
+ const permissionMode = helpers/* .PermissionModeHelper.toString */.T.toString(this.configService.getPermissionMode());
1956
+ return getIAMEntitiesByConfig(enableCompanyFeature, permissionMode);
1957
+ }
1958
+ async createDataSourceFromConfig(config) {
1959
+ const entities = await this.getIAMEntities();
1960
+ return await super.createDataSourceFromConfig(config, entities);
1961
+ }
1962
+ }
1963
+ IAMDataSourceService = _ts_decorate([
1964
+ (0,common_.Injectable)({
1965
+ scope: common_.Scope.REQUEST
1966
+ }),
1967
+ _ts_param(0, (0,common_.Inject)(iam_config_service/* .IAMConfigService */.N)),
1968
+ _ts_param(1, (0,common_.Optional)()),
1969
+ _ts_param(1, (0,common_.Inject)(__rspack_external__nestjs_core_d7b00a1a.REQUEST)),
1970
+ _ts_metadata("design:type", Function),
1971
+ _ts_metadata("design:paramtypes", [
1972
+ typeof iam_config_service/* .IAMConfigService */.N === "undefined" ? Object : iam_config_service/* .IAMConfigService */.N,
1973
+ typeof Request === "undefined" ? Object : Request
1974
+ ])
1975
+ ], IAMDataSourceService);
1976
+
1977
+
1978
+ },
1979
+ 99(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1980
+
1981
+ // EXPORTS
1982
+ __webpack_require__.d(__webpack_exports__, {
1983
+ D: () => (/* binding */ PermissionCacheService)
1984
+ });
1985
+
1986
+ ;// CONCATENATED MODULE: external "@flusys/nestjs-core/config"
1987
+
1988
+ // EXTERNAL MODULE: external "@flusys/nestjs-shared"
1989
+ var nestjs_shared_ = __webpack_require__(422);
1990
+ // EXTERNAL MODULE: external "@nestjs/common"
1991
+ var common_ = __webpack_require__(157);
1992
+ // EXTERNAL MODULE: external "typeorm"
1993
+ var external_typeorm_ = __webpack_require__(158);
1994
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/action.entity.ts
1995
+ var action_entity = __webpack_require__(864);
1996
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/permission-with-company.entity.ts
1997
+ var permission_with_company_entity = __webpack_require__(746);
1998
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/role-with-company.entity.ts
1999
+ var role_with_company_entity = __webpack_require__(353);
2000
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/role.entity.ts
2001
+ var role_entity = __webpack_require__(326);
2002
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/user-iam-permission.entity.ts
2003
+ var user_iam_permission_entity = __webpack_require__(489);
2004
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/enums/action-type.enum.ts
2005
+ var action_type_enum = __webpack_require__(560);
2006
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/enums/iam-entity-type.enum.ts
2007
+ var iam_entity_type_enum = __webpack_require__(85);
2008
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/enums/iam-permission-type.enum.ts
2009
+ var iam_permission_type_enum = __webpack_require__(517);
2010
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/enums/permission-type.enum.ts
2011
+ var permission_type_enum = __webpack_require__(841);
2012
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/services/iam-config.service.ts
2013
+ var iam_config_service = __webpack_require__(645);
2014
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/services/iam-datasource.service.ts + 1 modules
2015
+ var iam_datasource_service = __webpack_require__(831);
2016
+ ;// CONCATENATED MODULE: ./projects/nestjs-iam/src/services/permission-cache.service.ts
2017
+ function _ts_decorate(decorators, target, key, desc) {
2018
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2019
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
2020
+ r = Reflect.decorate(decorators, target, key, desc);
2021
+ } else {
2022
+ for(var i = decorators.length - 1; i >= 0; i--){
2023
+ if (d = decorators[i]) {
2024
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2025
+ }
2026
+ }
2027
+ }
2028
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2029
+ }
2030
+ function _ts_metadata(metadataKey, metadataValue) {
2031
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
2032
+ return Reflect.metadata(metadataKey, metadataValue);
2033
+ }
2034
+ }
2035
+ function _ts_param(paramIndex, decorator) {
2036
+ return function(target, key) {
2037
+ decorator(target, key, paramIndex);
2038
+ };
2039
+ }
2040
+
2041
+
2042
+
2043
+
2044
+
2045
+
2046
+
2047
+
2048
+
2049
+
2050
+
2051
+
2052
+
2053
+
2054
+
2055
+ const NO_COMPANY_SCOPE = 'none';
2056
+ class PermissionCacheService {
2057
+ cacheManager;
2058
+ iamConfigService;
2059
+ dataSourceProvider;
2060
+ guardConfig;
2061
+ TRACKED_KEYS_PREFIX = 'permission-tracked-keys';
2062
+ TRACKED_SCOPES_PREFIX = 'permission-tracked-scopes';
2063
+ TTL;
2064
+ constructor(cacheManager, iamConfigService, dataSourceProvider, guardConfig){
2065
+ this.cacheManager = cacheManager;
2066
+ this.iamConfigService = iamConfigService;
2067
+ this.dataSourceProvider = dataSourceProvider;
2068
+ this.guardConfig = guardConfig;
2069
+ this.TTL = this.parseDurationMs(__rspack_external__flusys_nestjs_core_config_197fa0a9.envConfig.getJwtConfig().refreshExpiration);
2070
+ }
2071
+ // Repository Getters
2072
+ async getPermissionRepository() {
2073
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2074
+ const entity = enableCompanyFeature ? permission_with_company_entity/* .UserIamPermissionWithCompany */.t : user_iam_permission_entity/* .UserIamPermission */.y;
2075
+ return this.dataSourceProvider.getRepository(entity);
2076
+ }
2077
+ async getActionRepository() {
2078
+ return this.dataSourceProvider.getRepository(action_entity/* .Action */.r);
2079
+ }
2080
+ async getRoleRepository() {
2081
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2082
+ const entity = enableCompanyFeature ? role_with_company_entity/* .RoleWithCompany */.g : role_entity/* .Role */.X;
2083
+ return this.dataSourceProvider.getRepository(entity);
2084
+ }
2085
+ // Cache Key Generation
2086
+ parseDurationMs(duration) {
2087
+ const unitMs = {
2088
+ ms: 1,
2089
+ s: 1000,
2090
+ m: 60000,
2091
+ h: 3600000,
2092
+ d: 86400000,
2093
+ w: 604800000
2094
+ };
2095
+ const match = /^(\d+)\s*(ms|s|m|h|d|w)?$/i.exec(duration.trim());
2096
+ if (!match) {
2097
+ return unitMs.h; // fallback: 1 hour
2098
+ }
2099
+ const unit = (match[2] || 'ms').toLowerCase();
2100
+ return Number(match[1]) * unitMs[unit];
2101
+ }
2102
+ buildCacheKey(options) {
2103
+ return (0,nestjs_shared_.buildPermissionCacheKey)(options, this.guardConfig);
2104
+ }
2105
+ scopeToken(companyId) {
2106
+ return companyId || NO_COMPANY_SCOPE;
2107
+ }
2108
+ buildTrackedKeysKey(userId, companyId) {
2109
+ return `${this.TRACKED_KEYS_PREFIX}:user:${userId}:company:${this.scopeToken(companyId)}`;
2110
+ }
2111
+ buildTrackedScopesKey(userId) {
2112
+ return `${this.TRACKED_SCOPES_PREFIX}:user:${userId}`;
2113
+ }
2114
+ // Cache Operations
2115
+ async setMyPermissions(options, data) {
2116
+ const key = this.buildCacheKey(options);
2117
+ await this.cacheManager.set(key, data, this.TTL);
2118
+ await this.trackKey(options.userId, key, options.companyId);
2119
+ }
2120
+ async getMyPermissions(options) {
2121
+ try {
2122
+ const key = this.buildCacheKey(options);
2123
+ const result = await this.cacheManager.get(key);
2124
+ return result || null;
2125
+ } catch {
2126
+ return null;
2127
+ }
2128
+ }
2129
+ async trackKey(userId, key, companyId) {
2130
+ try {
2131
+ let scopeKey = key;
2132
+ if (companyId) {
2133
+ scopeKey = this.buildTrackedKeysKey(userId, companyId);
2134
+ const keys = await this.cacheManager.get(scopeKey) || [];
2135
+ if (!keys.includes(key)) {
2136
+ keys.push(key);
2137
+ await this.cacheManager.set(scopeKey, keys, this.TTL);
2138
+ }
2139
+ }
2140
+ const scopesKey = this.buildTrackedScopesKey(userId);
2141
+ const scopes = await this.cacheManager.get(scopesKey) || [];
2142
+ if (!scopes.includes(scopeKey)) {
2143
+ scopes.push(scopeKey);
2144
+ await this.cacheManager.set(scopesKey, scopes, this.TTL);
2145
+ }
2146
+ } catch {
2147
+ // tracking is best-effort; a missed entry only widens invalidation, never narrows it
2148
+ }
2149
+ }
2150
+ // My Permissions (cache-first read, DB-backed rebuild)
2151
+ /** Get user's effective permissions (cache-first approach) */ async getMyPermissionsResponse(userId, branchId, companyId, parentCodes) {
2152
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2153
+ const cacheOptions = {
2154
+ userId,
2155
+ companyId: enableCompanyFeature ? companyId : null,
2156
+ branchId: enableCompanyFeature ? branchId : null
2157
+ };
2158
+ const cachedData = await this.getMyPermissions(cacheOptions);
2159
+ if (cachedData) {
2160
+ return this.buildResponseFromCache(cachedData, parentCodes);
2161
+ }
2162
+ const freshData = await this.fetchAndCachePermissions(userId, branchId, companyId);
2163
+ return this.buildResponseFromCache(freshData, parentCodes);
2164
+ }
2165
+ /** Build response from cached data, applying optional parentCodes filter */ async buildResponseFromCache(cachedData, parentCodes) {
2166
+ let frontendActions = cachedData.frontendActions;
2167
+ if (parentCodes?.length) {
2168
+ const parentIds = await this.getParentIdsByCodesWithCache(parentCodes);
2169
+ if (parentIds.size > 0) {
2170
+ frontendActions = frontendActions.filter((a)=>a.parentId && parentIds.has(a.parentId));
2171
+ } else {
2172
+ frontendActions = [];
2173
+ }
2174
+ }
2175
+ return {
2176
+ frontendActions: frontendActions.map((a)=>({
2177
+ code: a.code,
2178
+ name: a.name,
2179
+ description: a.description
2180
+ })),
2181
+ cachedEndpoints: cachedData.backendCodes.length
2182
+ };
2183
+ }
2184
+ /** Resolve action IDs for the given codes */ async getParentIdsByCodesWithCache(codes) {
2185
+ const actionRepo = await this.getActionRepository();
2186
+ const actions = await actionRepo.find({
2187
+ where: {
2188
+ code: (0,external_typeorm_.In)(codes)
2189
+ },
2190
+ select: [
2191
+ 'id',
2192
+ 'code'
2193
+ ]
2194
+ });
2195
+ return new Set(actions.map((action)=>action.id));
2196
+ }
2197
+ /** Fetch permissions from DB and cache them (empty permissions are also cached) */ async fetchAndCachePermissions(userId, branchId, companyId) {
2198
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2199
+ const cacheOptions = {
2200
+ userId,
2201
+ companyId: enableCompanyFeature ? companyId : null,
2202
+ branchId
2203
+ };
2204
+ const emptyData = {
2205
+ frontendActions: [],
2206
+ backendCodes: []
2207
+ };
2208
+ const allActionIds = await this.collectAllActionIds(userId, branchId, companyId);
2209
+ if (allActionIds.size === 0) {
2210
+ await this.setMyPermissions(cacheOptions, emptyData);
2211
+ return emptyData;
2212
+ }
2213
+ return this.buildAndCachePermissionData(allActionIds, cacheOptions);
2214
+ }
2215
+ /** Collect all action IDs based on permission mode (RBAC, DIRECT, or FULL) */ async collectAllActionIds(userId, branchId, companyId) {
2216
+ const permissionMode = this.iamConfigService.getPermissionMode();
2217
+ const allActionIds = new Set();
2218
+ if (permissionMode === permission_type_enum/* .IAMPermissionMode.RBAC */.w.RBAC || permissionMode === permission_type_enum/* .IAMPermissionMode.FULL */.w.FULL) {
2219
+ const userRoleIds = await this.getUserRoleIds(userId, branchId, companyId);
2220
+ if (userRoleIds.length > 0) {
2221
+ const roleActionIds = await this.getRoleActionIds(userRoleIds);
2222
+ roleActionIds.forEach((id)=>allActionIds.add(id));
2223
+ }
2224
+ }
2225
+ if (permissionMode === permission_type_enum/* .IAMPermissionMode.DIRECT */.w.DIRECT || permissionMode === permission_type_enum/* .IAMPermissionMode.FULL */.w.FULL) {
2226
+ const userActionIds = await this.getUserActionIds(userId, branchId, companyId);
2227
+ userActionIds.forEach((id)=>allActionIds.add(id));
2228
+ }
2229
+ return allActionIds;
2230
+ }
2231
+ /** Fetch actions from DB, separate by type, build cache data, and cache it */ async buildAndCachePermissionData(actionIds, cacheOptions) {
2232
+ const actionRepo = await this.getActionRepository();
2233
+ const actions = await actionRepo.find({
2234
+ where: {
2235
+ id: (0,external_typeorm_.In)(Array.from(actionIds)),
2236
+ isActive: true
2237
+ }
2238
+ });
2239
+ const backendActions = actions.filter((a)=>a.actionType === action_type_enum/* .ActionType.BACKEND */.X.BACKEND || a.actionType === action_type_enum/* .ActionType.BOTH */.X.BOTH);
2240
+ const frontendActions = actions.filter((a)=>a.actionType === action_type_enum/* .ActionType.FRONTEND */.X.FRONTEND || a.actionType === action_type_enum/* .ActionType.BOTH */.X.BOTH);
2241
+ const backendCodes = backendActions.map((a)=>a.code).filter((c)=>!!c);
2242
+ const cacheData = {
2243
+ frontendActions: frontendActions.map((a)=>({
2244
+ id: a.id,
2245
+ code: a.code ?? '',
2246
+ name: a.name,
2247
+ description: a.description,
2248
+ parentId: a.parentId
2249
+ })),
2250
+ backendCodes
2251
+ };
2252
+ await this.setMyPermissions(cacheOptions, cacheData);
2253
+ return cacheData;
2254
+ }
2255
+ /** Get role IDs assigned to a user (merges company-wide + branch-specific roles) */ async getUserRoleIds(userId, branchId, companyId) {
2256
+ const permissionRepo = await this.getPermissionRepository();
2257
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2258
+ if (!enableCompanyFeature) {
2259
+ const permissions = await permissionRepo.find({
2260
+ where: {
2261
+ permissionType: iam_permission_type_enum/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
2262
+ sourceType: iam_entity_type_enum/* .IamEntityType.USER */.n.USER,
2263
+ sourceId: userId
2264
+ }
2265
+ });
2266
+ return permissions.filter((p)=>p.isValid()).map((p)=>p.targetId);
2267
+ }
2268
+ const roleIds = new Set();
2269
+ const baseWhere = {
2270
+ permissionType: iam_permission_type_enum/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
2271
+ sourceType: iam_entity_type_enum/* .IamEntityType.USER */.n.USER,
2272
+ sourceId: userId
2273
+ };
2274
+ if (companyId) {
2275
+ baseWhere.companyId = companyId;
2276
+ }
2277
+ if (branchId) {
2278
+ // Get company-wide + branch-specific roles
2279
+ const companyWidePermissions = await permissionRepo.find({
2280
+ where: {
2281
+ ...baseWhere,
2282
+ branchId: (0,external_typeorm_.IsNull)()
2283
+ }
2284
+ });
2285
+ companyWidePermissions.filter((p)=>p.isValid()).forEach((p)=>roleIds.add(p.targetId));
2286
+ const branchPermissions = await permissionRepo.find({
2287
+ where: {
2288
+ ...baseWhere,
2289
+ branchId
2290
+ }
2291
+ });
2292
+ branchPermissions.filter((p)=>p.isValid()).forEach((p)=>roleIds.add(p.targetId));
2293
+ } else {
2294
+ // No branch context: get all roles for this company
2295
+ const allPermissions = await permissionRepo.find({
2296
+ where: baseWhere
2297
+ });
2298
+ allPermissions.filter((p)=>p.isValid()).forEach((p)=>roleIds.add(p.targetId));
2299
+ }
2300
+ return Array.from(roleIds);
2301
+ }
2302
+ async getRoleActionIds(roleIds) {
2303
+ const permissionRepo = await this.getPermissionRepository();
2304
+ const permissions = await permissionRepo.find({
2305
+ where: {
2306
+ permissionType: iam_permission_type_enum/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
2307
+ sourceType: iam_entity_type_enum/* .IamEntityType.ROLE */.n.ROLE,
2308
+ sourceId: (0,external_typeorm_.In)(roleIds)
2309
+ }
2310
+ });
2311
+ return permissions.filter((p)=>p.isValid()).map((p)=>p.targetId);
2312
+ }
2313
+ /** Get action IDs directly assigned to a user (merges company-wide + branch-specific actions) */ async getUserActionIds(userId, branchId, companyId) {
2314
+ const permissionRepo = await this.getPermissionRepository();
2315
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2316
+ if (!enableCompanyFeature) {
2317
+ const permissions = await permissionRepo.find({
2318
+ where: {
2319
+ permissionType: iam_permission_type_enum/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2320
+ sourceType: iam_entity_type_enum/* .IamEntityType.USER */.n.USER,
2321
+ sourceId: userId
2322
+ }
2323
+ });
2324
+ return permissions.filter((p)=>p.isValid()).map((p)=>p.targetId);
2325
+ }
2326
+ const actionIds = new Set();
2327
+ const baseWhere = {
2328
+ permissionType: iam_permission_type_enum/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2329
+ sourceType: iam_entity_type_enum/* .IamEntityType.USER */.n.USER,
2330
+ sourceId: userId
2331
+ };
2332
+ if (companyId) {
2333
+ baseWhere.companyId = companyId;
2334
+ }
2335
+ if (branchId) {
2336
+ // Get company-wide + branch-specific actions
2337
+ const companyWidePermissions = await permissionRepo.find({
2338
+ where: {
2339
+ ...baseWhere,
2340
+ branchId: (0,external_typeorm_.IsNull)()
2341
+ }
2342
+ });
2343
+ companyWidePermissions.filter((p)=>p.isValid()).forEach((p)=>actionIds.add(p.targetId));
2344
+ const branchPermissions = await permissionRepo.find({
2345
+ where: {
2346
+ ...baseWhere,
2347
+ branchId
2348
+ }
2349
+ });
2350
+ branchPermissions.filter((p)=>p.isValid()).forEach((p)=>actionIds.add(p.targetId));
2351
+ } else {
2352
+ // No branch context: get all actions for this company
2353
+ const allPermissions = await permissionRepo.find({
2354
+ where: baseWhere
2355
+ });
2356
+ allPermissions.filter((p)=>p.isValid()).forEach((p)=>actionIds.add(p.targetId));
2357
+ }
2358
+ return Array.from(actionIds);
2359
+ }
2360
+ // Cache Invalidation
2361
+ async invalidateUser(userId, companyId, branchIds) {
2362
+ const keysToDelete = new Set();
2363
+ /** Drop a scope entry from the tracked-scopes index, or queue the whole index for deletion once nothing remains */ const untrackScope = async (scopeKey)=>{
2364
+ const scopesKeysKey = this.buildTrackedScopesKey(userId);
2365
+ let scopesKeys = [];
2366
+ try {
2367
+ scopesKeys = await this.cacheManager.get(scopesKeysKey) || [];
2368
+ } catch {
2369
+ scopesKeys = [];
2370
+ }
2371
+ if (scopeKey) {
2372
+ const remainingScopes = scopesKeys.filter((scope)=>scope !== scopeKey);
2373
+ if (remainingScopes.length > 0) {
2374
+ await this.cacheManager.set(scopesKeysKey, remainingScopes, this.TTL);
2375
+ } else {
2376
+ keysToDelete.add(scopesKeysKey);
2377
+ }
2378
+ } else {
2379
+ for (const scope of scopesKeys){
2380
+ if (scope.startsWith(this.TRACKED_KEYS_PREFIX)) {
2381
+ let nestedKeys = [];
2382
+ try {
2383
+ nestedKeys = await this.cacheManager.get(scope) || [];
2384
+ } catch {
2385
+ nestedKeys = [];
2386
+ }
2387
+ nestedKeys.forEach((key)=>keysToDelete.add(key));
2388
+ }
2389
+ keysToDelete.add(scope);
2390
+ }
2391
+ keysToDelete.add(scopesKeysKey);
2392
+ }
2393
+ };
2394
+ if (companyId) {
2395
+ const trackedKeysKey = this.buildTrackedKeysKey(userId, companyId);
2396
+ let trackedKeys = [];
2397
+ try {
2398
+ trackedKeys = await this.cacheManager.get(trackedKeysKey) || [];
2399
+ } catch {
2400
+ trackedKeys = [];
2401
+ }
2402
+ const hasCompanyWideScope = branchIds?.some((branchId)=>!branchId);
2403
+ if (!branchIds?.length || hasCompanyWideScope) {
2404
+ trackedKeys.forEach((key)=>keysToDelete.add(key));
2405
+ keysToDelete.add(trackedKeysKey);
2406
+ await untrackScope(trackedKeysKey);
2407
+ } else {
2408
+ // Branch scope given: only invalidate those branches, keep the rest tracked
2409
+ branchIds.forEach((branchId)=>keysToDelete.add(this.buildCacheKey({
2410
+ userId,
2411
+ companyId,
2412
+ branchId
2413
+ })));
2414
+ const remainingKeys = trackedKeys.filter((key)=>!keysToDelete.has(key));
2415
+ if (remainingKeys.length) {
2416
+ await this.cacheManager.set(trackedKeysKey, remainingKeys, this.TTL);
2417
+ } else {
2418
+ keysToDelete.add(trackedKeysKey);
2419
+ await untrackScope(trackedKeysKey);
2420
+ }
2421
+ }
2422
+ } else {
2423
+ await untrackScope();
2424
+ }
2425
+ await Promise.all(Array.from(keysToDelete).map(async (key)=>{
2426
+ try {
2427
+ await this.cacheManager.del(key);
2428
+ } catch {}
2429
+ }));
2430
+ }
2431
+ async invalidateUsers(userIds, companyId, branchIds) {
2432
+ if (userIds.length === 0) {
2433
+ return 0;
2434
+ }
2435
+ const results = await Promise.allSettled(userIds.map((userId)=>this.invalidateUser(userId, companyId, branchIds)));
2436
+ return results.filter((r)=>r.status === 'fulfilled').length;
2437
+ }
2438
+ /** Invalidate permission cache for all users holding a given role */ async invalidateRoleMembersCache(roleId) {
2439
+ const permissionRepo = await this.getPermissionRepository();
2440
+ const roleRepo = await this.getRoleRepository();
2441
+ const userRoles = await permissionRepo.find({
2442
+ where: {
2443
+ permissionType: iam_permission_type_enum/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
2444
+ sourceType: iam_entity_type_enum/* .IamEntityType.USER */.n.USER,
2445
+ targetType: iam_entity_type_enum/* .IamEntityType.ROLE */.n.ROLE,
2446
+ targetId: roleId
2447
+ }
2448
+ });
2449
+ const userIds = [
2450
+ ...new Set(userRoles.map((ur)=>ur.sourceId))
2451
+ ];
2452
+ if (userIds.length === 0) {
2453
+ return 0;
2454
+ }
2455
+ const role = await roleRepo.findOne({
2456
+ where: {
2457
+ id: roleId
2458
+ }
2459
+ });
2460
+ const companyId = role?.companyId || null;
2461
+ return this.invalidateUsers(userIds, companyId);
2462
+ }
2463
+ /** Invalidate permission cache for all users in a company */ async invalidateCompanyMembersCache(companyId) {
2464
+ if (!this.iamConfigService.isCompanyFeatureEnabled()) {
2465
+ return 0;
2466
+ }
2467
+ const permissionRepo = await this.getPermissionRepository();
2468
+ const userPermissions = await permissionRepo.createQueryBuilder('p').select('DISTINCT p.source_id', 'userId').where('p.company_id = :companyId', {
2469
+ companyId
2470
+ }).andWhere('p.source_type = :sourceType', {
2471
+ sourceType: iam_entity_type_enum/* .IamEntityType.USER */.n.USER
2472
+ }).getRawMany();
2473
+ const userIds = [
2474
+ ...new Set(userPermissions.map((p)=>p.userId).filter(Boolean))
2475
+ ];
2476
+ if (userIds.length === 0) {
2477
+ return 0;
2478
+ }
2479
+ return this.invalidateUsers(userIds, companyId);
2480
+ }
2481
+ }
2482
+ _ts_decorate([
2483
+ (0,nestjs_shared_.LogAction)({
2484
+ action: 'permissionCache.setMyPermissions',
2485
+ module: 'iam'
2486
+ }),
2487
+ _ts_metadata("design:type", Function),
2488
+ _ts_metadata("design:paramtypes", [
2489
+ typeof PermissionCacheKeyOptions === "undefined" ? Object : PermissionCacheKeyOptions,
2490
+ typeof CachedMyPermissions === "undefined" ? Object : CachedMyPermissions
2491
+ ]),
2492
+ _ts_metadata("design:returntype", Promise)
2493
+ ], PermissionCacheService.prototype, "setMyPermissions", null);
2494
+ _ts_decorate([
2495
+ (0,nestjs_shared_.LogAction)({
2496
+ action: 'permissionCache.invalidateUser',
2497
+ module: 'iam'
2498
+ }),
2499
+ _ts_metadata("design:type", Function),
2500
+ _ts_metadata("design:paramtypes", [
2501
+ String,
2502
+ Object,
2503
+ Array
2504
+ ]),
2505
+ _ts_metadata("design:returntype", Promise)
2506
+ ], PermissionCacheService.prototype, "invalidateUser", null);
2507
+ _ts_decorate([
2508
+ (0,nestjs_shared_.LogAction)({
2509
+ action: 'permissionCache.invalidateUsers',
2510
+ module: 'iam'
2511
+ }),
2512
+ _ts_metadata("design:type", Function),
2513
+ _ts_metadata("design:paramtypes", [
2514
+ Array,
2515
+ Object,
2516
+ Array
2517
+ ]),
2518
+ _ts_metadata("design:returntype", Promise)
2519
+ ], PermissionCacheService.prototype, "invalidateUsers", null);
2520
+ PermissionCacheService = _ts_decorate([
2521
+ (0,common_.Injectable)({
2522
+ scope: common_.Scope.REQUEST
2523
+ }),
2524
+ _ts_param(0, (0,common_.Inject)('CACHE_INSTANCE')),
2525
+ _ts_param(1, (0,common_.Inject)(iam_config_service/* .IAMConfigService */.N)),
2526
+ _ts_param(2, (0,common_.Inject)(iam_datasource_service/* .IAMDataSourceService */.U)),
2527
+ _ts_param(3, (0,common_.Optional)()),
2528
+ _ts_param(3, (0,common_.Inject)(nestjs_shared_.PERMISSION_GUARD_CONFIG)),
2529
+ _ts_metadata("design:type", Function),
2530
+ _ts_metadata("design:paramtypes", [
2531
+ typeof nestjs_shared_.HybridCache === "undefined" ? Object : nestjs_shared_.HybridCache,
2532
+ typeof iam_config_service/* .IAMConfigService */.N === "undefined" ? Object : iam_config_service/* .IAMConfigService */.N,
2533
+ typeof iam_datasource_service/* .IAMDataSourceService */.U === "undefined" ? Object : iam_datasource_service/* .IAMDataSourceService */.U,
2534
+ typeof PermissionGuardConfig === "undefined" ? Object : PermissionGuardConfig
2535
+ ])
2536
+ ], PermissionCacheService);
2537
+
2538
+
2539
+ },
2540
+ 472(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
2541
+ /* import */ var _flusys_nestjs_shared__rspack_import_0 = __webpack_require__(422);
2542
+ /* import */ var _flusys_nestjs_shared_classes__rspack_import_1 = __webpack_require__(937);
2543
+ /* import */ var _nestjs_common__rspack_import_2 = __webpack_require__(157);
2544
+ /* import */ var typeorm__rspack_import_3 = __webpack_require__(158);
2545
+ /* import */ var _config_index_js__rspack_import_13 = __webpack_require__(490);
2546
+ /* import */ var _config_index_js__rspack_import_16 = __webpack_require__(916);
2547
+ /* import */ var _dtos_permission_dto_js__rspack_import_4 = __webpack_require__(296);
2548
+ /* import */ var _entities_action_entity_js__rspack_import_5 = __webpack_require__(864);
2549
+ /* import */ var _entities_permission_with_company_entity_js__rspack_import_6 = __webpack_require__(746);
2550
+ /* import */ var _entities_role_with_company_entity_js__rspack_import_7 = __webpack_require__(353);
2551
+ /* import */ var _entities_role_entity_js__rspack_import_8 = __webpack_require__(326);
2552
+ /* import */ var _entities_user_iam_permission_entity_js__rspack_import_9 = __webpack_require__(489);
2553
+ /* import */ var _enums_iam_entity_type_enum_js__rspack_import_15 = __webpack_require__(85);
2554
+ /* import */ var _enums_iam_permission_type_enum_js__rspack_import_14 = __webpack_require__(517);
2555
+ /* import */ var _iam_config_service_js__rspack_import_10 = __webpack_require__(645);
2556
+ /* import */ var _iam_datasource_service_js__rspack_import_11 = __webpack_require__(831);
2557
+ /* import */ var _permission_cache_service_js__rspack_import_12 = __webpack_require__(99);
2558
+ function _ts_decorate(decorators, target, key, desc) {
2559
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2560
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
2561
+ r = Reflect.decorate(decorators, target, key, desc);
2562
+ } else {
2563
+ for(var i = decorators.length - 1; i >= 0; i--){
2564
+ if (d = decorators[i]) {
2565
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2566
+ }
2567
+ }
2568
+ }
2569
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
2570
+ }
2571
+ function _ts_metadata(metadataKey, metadataValue) {
2572
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
2573
+ return Reflect.metadata(metadataKey, metadataValue);
2574
+ }
2575
+ }
2576
+ function _ts_param(paramIndex, decorator) {
2577
+ return function(target, key) {
2578
+ decorator(target, key, paramIndex);
2579
+ };
2580
+ }
2581
+
2582
+
2583
+
2584
+
2585
+
2586
+
2587
+
2588
+
2589
+
2590
+
2591
+
2592
+
2593
+
2594
+
2595
+
2596
+
2597
+ class PermissionService {
2598
+ permissionCacheService;
2599
+ iamConfigService;
2600
+ dataSourceProvider;
2601
+ // NOTE: @Inject() required for bundled code - type metadata may be lost during esbuild
2602
+ constructor(permissionCacheService, iamConfigService, dataSourceProvider){
2603
+ this.permissionCacheService = permissionCacheService;
2604
+ this.iamConfigService = iamConfigService;
2605
+ this.dataSourceProvider = dataSourceProvider;
2606
+ }
2607
+ // Repository Getters
2608
+ async getPermissionRepository() {
2609
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2610
+ const entity = enableCompanyFeature ? _entities_permission_with_company_entity_js__rspack_import_6/* .UserIamPermissionWithCompany */.t : _entities_user_iam_permission_entity_js__rspack_import_9/* .UserIamPermission */.y;
2611
+ return this.dataSourceProvider.getRepository(entity);
2612
+ }
2613
+ async getActionRepository() {
2614
+ return this.dataSourceProvider.getRepository(_entities_action_entity_js__rspack_import_5/* .Action */.r);
2615
+ }
2616
+ async getRoleRepository() {
2617
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2618
+ const entity = enableCompanyFeature ? _entities_role_with_company_entity_js__rspack_import_7/* .RoleWithCompany */.g : _entities_role_entity_js__rspack_import_8/* .Role */.X;
2619
+ return this.dataSourceProvider.getRepository(entity);
2620
+ }
2621
+ async getActionsMap(actionIds) {
2622
+ const actionRepo = await this.getActionRepository();
2623
+ const actions = await actionRepo.find({
2624
+ where: {
2625
+ id: (0,typeorm__rspack_import_3.In)(actionIds)
2626
+ }
2627
+ });
2628
+ return new Map(actions.map((a)=>[
2629
+ a.id,
2630
+ a
2631
+ ]));
2632
+ }
2633
+ // User-Action Permissions
2634
+ async assignUserActions(dto) {
2635
+ if (!this.iamConfigService.isDirectPermissionEnabled()) {
2636
+ throw new _nestjs_common__rspack_import_2.BadRequestException({
2637
+ message: 'Direct permission assignment not available in RBAC-only mode. Use role-based permissions instead.',
2638
+ messageKey: _config_index_js__rspack_import_13/* .IAM_MODE_MESSAGES.DIRECT_MODE_UNAVAILABLE */.xI.DIRECT_MODE_UNAVAILABLE
2639
+ });
2640
+ }
2641
+ const permissionRepo = await this.getPermissionRepository();
2642
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2643
+ const branchId = dto.branchId ?? null;
2644
+ const companyId = dto.companyId ?? null;
2645
+ const { toAdd: itemsToAdd, toRemove: itemsToRemove } = this.splitItemsByAction(dto.items);
2646
+ let added = 0;
2647
+ let removed = 0;
2648
+ if (itemsToAdd.length > 0) {
2649
+ const actionIdsToAdd = itemsToAdd.map((item)=>item.id);
2650
+ const whereFind = {
2651
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2652
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
2653
+ sourceId: dto.userId,
2654
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2655
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToAdd)
2656
+ };
2657
+ if (enableCompanyFeature) {
2658
+ if (companyId) whereFind.companyId = companyId;
2659
+ if (branchId) whereFind.branchId = branchId;
2660
+ }
2661
+ const existingPermissions = await permissionRepo.find({
2662
+ where: whereFind,
2663
+ select: [
2664
+ 'targetId'
2665
+ ]
2666
+ });
2667
+ const existingActionIds = new Set(existingPermissions.map((p)=>p.targetId));
2668
+ const newPermissions = itemsToAdd.filter((item)=>!existingActionIds.has(item.id)).map((item)=>({
2669
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2670
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
2671
+ sourceId: dto.userId,
2672
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2673
+ targetId: item.id,
2674
+ companyId: enableCompanyFeature ? companyId : null,
2675
+ branchId: enableCompanyFeature ? branchId : null
2676
+ }));
2677
+ if (newPermissions.length > 0) {
2678
+ try {
2679
+ await permissionRepo.save(newPermissions);
2680
+ added = newPermissions.length;
2681
+ } catch (error) {
2682
+ if (error?.code === 'ER_DUP_ENTRY' || error?.message?.includes('Duplicate entry')) {
2683
+ throw new _nestjs_common__rspack_import_2.ConflictException({
2684
+ message: 'Some permissions already exist for this user. Please refresh and try again.',
2685
+ messageKey: _config_index_js__rspack_import_13/* .PERMISSION_OPERATION_MESSAGES.ALREADY_EXISTS */.P3.ALREADY_EXISTS
2686
+ });
2687
+ }
2688
+ throw error;
2689
+ }
2690
+ }
2691
+ }
2692
+ if (itemsToRemove.length > 0) {
2693
+ const actionIdsToRemove = itemsToRemove.map((item)=>item.id);
2694
+ const whereDelete = {
2695
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2696
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
2697
+ sourceId: dto.userId,
2698
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2699
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToRemove)
2700
+ };
2701
+ if (enableCompanyFeature) {
2702
+ if (companyId) whereDelete.companyId = companyId;
2703
+ if (branchId) whereDelete.branchId = branchId;
2704
+ }
2705
+ const result = await permissionRepo.delete(whereDelete);
2706
+ removed = result.affected || 0;
2707
+ }
2708
+ await this.permissionCacheService.invalidateUser(dto.userId, enableCompanyFeature ? companyId : null, enableCompanyFeature ? [
2709
+ branchId
2710
+ ] : []);
2711
+ const result = this.buildOperationResult(dto.items.length, added, removed);
2712
+ await this.publishAssignmentEvent(_config_index_js__rspack_import_16/* .IAM_EVENT_ENTITIES.USER_ACTION */.H.USER_ACTION, dto.userId, result);
2713
+ return result;
2714
+ }
2715
+ async getUserActions(userId, companyId, branchId) {
2716
+ const permissionRepo = await this.getPermissionRepository();
2717
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2718
+ const where = {
2719
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2720
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
2721
+ sourceId: userId
2722
+ };
2723
+ if (enableCompanyFeature) {
2724
+ if (companyId) where.companyId = companyId;
2725
+ if (branchId) where.branchId = branchId;
2726
+ }
2727
+ const permissions = await permissionRepo.find({
2728
+ where
2729
+ });
2730
+ if (permissions.length === 0) {
2731
+ return [];
2732
+ }
2733
+ const actionIds = permissions.map((p)=>p.targetId);
2734
+ const actionMap = await this.getActionsMap(actionIds);
2735
+ return permissions.filter((p)=>actionMap.has(p.targetId)).map((p)=>{
2736
+ const action = actionMap.get(p.targetId);
2737
+ return {
2738
+ id: p.id,
2739
+ userId: p.sourceId,
2740
+ actionId: action.id,
2741
+ actionCode: action.code ?? '',
2742
+ actionName: action.name,
2743
+ companyId: ('companyId' in p ? p.companyId : null) ?? null,
2744
+ branchId: ('branchId' in p ? p.branchId : null) ?? null,
2745
+ createdAt: p.createdAt
2746
+ };
2747
+ });
2748
+ }
2749
+ /** Get users directly assigned an action (reverse lookup: action -> users) */ async getUsersForAction(actionId) {
2750
+ const permissionRepo = await this.getPermissionRepository();
2751
+ const permissions = await permissionRepo.find({
2752
+ where: {
2753
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2754
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2755
+ targetId: actionId
2756
+ }
2757
+ });
2758
+ return permissions.map((p)=>({
2759
+ id: p.id,
2760
+ userId: p.sourceId,
2761
+ createdAt: p.createdAt
2762
+ }));
2763
+ }
2764
+ // Role-Action Permissions
2765
+ async assignRoleActions(dto) {
2766
+ if (!this.iamConfigService.isRbacEnabled()) {
2767
+ throw new _nestjs_common__rspack_import_2.BadRequestException({
2768
+ message: 'Role-based permission assignment not available in DIRECT-only mode. Use direct user permissions instead.',
2769
+ messageKey: _config_index_js__rspack_import_13/* .IAM_MODE_MESSAGES.RBAC_MODE_UNAVAILABLE */.xI.RBAC_MODE_UNAVAILABLE
2770
+ });
2771
+ }
2772
+ const permissionRepo = await this.getPermissionRepository();
2773
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2774
+ let roleCompanyId = null;
2775
+ if (enableCompanyFeature) {
2776
+ const roleRepo = await this.getRoleRepository();
2777
+ const role = await roleRepo.findOne({
2778
+ where: {
2779
+ id: dto.roleId
2780
+ },
2781
+ select: [
2782
+ 'id',
2783
+ 'companyId'
2784
+ ]
2785
+ });
2786
+ roleCompanyId = role?.companyId ?? null;
2787
+ }
2788
+ const { toAdd: itemsToAdd, toRemove: itemsToRemove } = this.splitItemsByAction(dto.items);
2789
+ let added = 0;
2790
+ let removed = 0;
2791
+ if (itemsToAdd.length > 0) {
2792
+ const actionIdsToAdd = itemsToAdd.map((item)=>item.id);
2793
+ const existingPermissions = await permissionRepo.find({
2794
+ where: {
2795
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
2796
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
2797
+ sourceId: dto.roleId,
2798
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2799
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToAdd)
2800
+ },
2801
+ select: [
2802
+ 'targetId'
2803
+ ]
2804
+ });
2805
+ const existingActionIds = new Set(existingPermissions.map((p)=>p.targetId));
2806
+ const newPermissions = itemsToAdd.filter((item)=>!existingActionIds.has(item.id)).map((item)=>({
2807
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
2808
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
2809
+ sourceId: dto.roleId,
2810
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2811
+ targetId: item.id,
2812
+ companyId: enableCompanyFeature ? roleCompanyId : null,
2813
+ branchId: null
2814
+ }));
2815
+ if (newPermissions.length > 0) {
2816
+ try {
2817
+ await permissionRepo.save(newPermissions);
2818
+ added = newPermissions.length;
2819
+ } catch (error) {
2820
+ if (error?.code === 'ER_DUP_ENTRY' || error?.message?.includes('Duplicate entry')) {
2821
+ throw new _nestjs_common__rspack_import_2.ConflictException({
2822
+ message: 'Some role-action permissions already exist. Please refresh and try again.',
2823
+ messageKey: _config_index_js__rspack_import_13/* .PERMISSION_OPERATION_MESSAGES.ALREADY_EXISTS */.P3.ALREADY_EXISTS
2824
+ });
2825
+ }
2826
+ throw error;
2827
+ }
2828
+ }
2829
+ }
2830
+ if (itemsToRemove.length > 0) {
2831
+ const actionIdsToRemove = itemsToRemove.map((item)=>item.id);
2832
+ const result = await permissionRepo.delete({
2833
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
2834
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
2835
+ sourceId: dto.roleId,
2836
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2837
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToRemove)
2838
+ });
2839
+ removed = result.affected || 0;
2840
+ }
2841
+ await this.permissionCacheService.invalidateRoleMembersCache(dto.roleId);
2842
+ const result = this.buildOperationResult(dto.items.length, added, removed);
2843
+ await this.publishAssignmentEvent(_config_index_js__rspack_import_16/* .IAM_EVENT_ENTITIES.ROLE_ACTION */.H.ROLE_ACTION, dto.roleId, result);
2844
+ return result;
2845
+ }
2846
+ async getRoleActions(roleId) {
2847
+ const permissionRepo = await this.getPermissionRepository();
2848
+ const permissions = await permissionRepo.find({
2849
+ where: {
2850
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
2851
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
2852
+ sourceId: roleId
2853
+ }
2854
+ });
2855
+ if (permissions.length === 0) {
2856
+ return [];
2857
+ }
2858
+ const actionIds = permissions.map((p)=>p.targetId);
2859
+ const actionMap = await this.getActionsMap(actionIds);
2860
+ return permissions.filter((p)=>actionMap.has(p.targetId)).map((p)=>{
2861
+ const action = actionMap.get(p.targetId);
2862
+ return {
2863
+ id: p.id,
2864
+ roleId: p.sourceId,
2865
+ actionId: action.id,
2866
+ actionCode: action.code ?? '',
2867
+ actionName: action.name,
2868
+ createdAt: p.createdAt
2869
+ };
2870
+ });
2871
+ }
2872
+ // Company-Action Permissions (Whitelist)
2873
+ /** Assign or remove actions to/from a company (whitelist) */ async assignCompanyActions(dto) {
2874
+ const permissionRepo = await this.getPermissionRepository();
2875
+ const dataSource = await this.dataSourceProvider.getDataSource();
2876
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2877
+ const { toAdd: itemsToAdd, toRemove: itemsToRemove } = this.splitItemsByAction(dto.items);
2878
+ let added = 0;
2879
+ let removed = 0;
2880
+ await dataSource.transaction(async (manager)=>{
2881
+ const transactionalPermissionRepo = manager.getRepository(permissionRepo.target);
2882
+ if (itemsToAdd.length > 0) {
2883
+ const actionIdsToAdd = itemsToAdd.map((item)=>item.id);
2884
+ const existingPermissions = await transactionalPermissionRepo.find({
2885
+ where: {
2886
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.COMPANY_ACTION */.V.COMPANY_ACTION,
2887
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.COMPANY */.n.COMPANY,
2888
+ sourceId: dto.companyId,
2889
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2890
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToAdd)
2891
+ },
2892
+ select: [
2893
+ 'targetId'
2894
+ ]
2895
+ });
2896
+ const existingActionIds = new Set(existingPermissions.map((p)=>p.targetId));
2897
+ const newActionIds = actionIdsToAdd.filter((id)=>!existingActionIds.has(id));
2898
+ if (newActionIds.length > 0) {
2899
+ const newPermissions = newActionIds.map((actionId)=>transactionalPermissionRepo.create({
2900
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.COMPANY_ACTION */.V.COMPANY_ACTION,
2901
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.COMPANY */.n.COMPANY,
2902
+ sourceId: dto.companyId,
2903
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2904
+ targetId: actionId
2905
+ }));
2906
+ await transactionalPermissionRepo.save(newPermissions);
2907
+ added = newPermissions.length;
2908
+ }
2909
+ }
2910
+ if (itemsToRemove.length > 0) {
2911
+ const actionIdsToRemove = itemsToRemove.map((item)=>item.id);
2912
+ const companyResult = await transactionalPermissionRepo.delete({
2913
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.COMPANY_ACTION */.V.COMPANY_ACTION,
2914
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.COMPANY */.n.COMPANY,
2915
+ sourceId: dto.companyId,
2916
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2917
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToRemove)
2918
+ });
2919
+ removed = companyResult.affected || 0;
2920
+ // Cascade: an action no longer on the company whitelist must not remain
2921
+ // reachable via role grants or direct user grants scoped to this company.
2922
+ const roleEntity = enableCompanyFeature ? _entities_role_with_company_entity_js__rspack_import_7/* .RoleWithCompany */.g : _entities_role_entity_js__rspack_import_8/* .Role */.X;
2923
+ const roleRepo = manager.getRepository(roleEntity);
2924
+ const companyRoles = await roleRepo.find({
2925
+ where: {
2926
+ companyId: dto.companyId,
2927
+ deletedAt: (0,typeorm__rspack_import_3.IsNull)()
2928
+ },
2929
+ select: [
2930
+ 'id'
2931
+ ]
2932
+ });
2933
+ if (companyRoles.length > 0) {
2934
+ const roleIds = companyRoles.map((role)=>role.id);
2935
+ await transactionalPermissionRepo.delete({
2936
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
2937
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
2938
+ sourceId: (0,typeorm__rspack_import_3.In)(roleIds),
2939
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2940
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToRemove)
2941
+ });
2942
+ }
2943
+ if (enableCompanyFeature) {
2944
+ await transactionalPermissionRepo.delete({
2945
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
2946
+ companyId: dto.companyId,
2947
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ACTION */.n.ACTION,
2948
+ targetId: (0,typeorm__rspack_import_3.In)(actionIdsToRemove)
2949
+ });
2950
+ }
2951
+ }
2952
+ });
2953
+ await this.permissionCacheService.invalidateCompanyMembersCache(dto.companyId);
2954
+ const result = this.buildOperationResult(dto.items.length, added, removed);
2955
+ await this.publishAssignmentEvent(_config_index_js__rspack_import_16/* .IAM_EVENT_ENTITIES.COMPANY_ACTION */.H.COMPANY_ACTION, dto.companyId, result);
2956
+ return result;
2957
+ }
2958
+ /** Get all actions assigned to a company (whitelist) */ async getCompanyActions(companyId, isOnlyId = false) {
2959
+ const permissionRepo = await this.getPermissionRepository();
2960
+ const permissions = await permissionRepo.find({
2961
+ where: {
2962
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.COMPANY_ACTION */.V.COMPANY_ACTION,
2963
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.COMPANY */.n.COMPANY,
2964
+ sourceId: companyId
2965
+ }
2966
+ });
2967
+ if (permissions.length === 0) {
2968
+ return [];
2969
+ }
2970
+ const actionIds = permissions.map((p)=>p.targetId);
2971
+ if (isOnlyId) return actionIds;
2972
+ const actionMap = await this.getActionsMap(actionIds);
2973
+ return permissions.filter((p)=>actionMap.has(p.targetId)).map((p)=>{
2974
+ const action = actionMap.get(p.targetId);
2975
+ return {
2976
+ id: p.id,
2977
+ companyId: companyId,
2978
+ actionId: action.id,
2979
+ actionCode: action.code ?? '',
2980
+ actionName: action.name,
2981
+ createdAt: p.createdAt
2982
+ };
2983
+ });
2984
+ }
2985
+ // User-Role Permissions
2986
+ /** Assign user to roles (branch-scoped when company feature is enabled) */ async assignUserRoles(dto) {
2987
+ if (!this.iamConfigService.isRbacEnabled()) {
2988
+ throw new _nestjs_common__rspack_import_2.BadRequestException({
2989
+ message: 'Role assignment not available in DIRECT-only mode. Use direct user permissions instead.',
2990
+ messageKey: _config_index_js__rspack_import_13/* .IAM_MODE_MESSAGES.ROLE_ASSIGNMENT_UNAVAILABLE */.xI.ROLE_ASSIGNMENT_UNAVAILABLE
2991
+ });
2992
+ }
2993
+ const permissionRepo = await this.getPermissionRepository();
2994
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
2995
+ const branchId = dto.branchId ?? null;
2996
+ const companyId = dto.companyId ?? null;
2997
+ const { toAdd: itemsToAdd, toRemove: itemsToRemove } = this.splitItemsByAction(dto.items);
2998
+ let added = 0;
2999
+ let removed = 0;
3000
+ if (itemsToAdd.length > 0) {
3001
+ const roleIdsToAdd = itemsToAdd.map((item)=>item.id);
3002
+ const whereFind = {
3003
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3004
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3005
+ sourceId: dto.userId,
3006
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
3007
+ targetId: (0,typeorm__rspack_import_3.In)(roleIdsToAdd)
3008
+ };
3009
+ if (enableCompanyFeature) {
3010
+ if (companyId) whereFind.companyId = companyId;
3011
+ if (branchId) whereFind.branchId = branchId;
3012
+ }
3013
+ const existingPermissions = await permissionRepo.find({
3014
+ where: whereFind,
3015
+ select: [
3016
+ 'targetId'
3017
+ ]
3018
+ });
3019
+ const existingRoleIds = new Set(existingPermissions.map((p)=>p.targetId));
3020
+ const newPermissions = itemsToAdd.filter((item)=>!existingRoleIds.has(item.id)).map((item)=>({
3021
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3022
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3023
+ sourceId: dto.userId,
3024
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
3025
+ targetId: item.id,
3026
+ companyId: enableCompanyFeature ? companyId : null,
3027
+ branchId: enableCompanyFeature ? branchId : null
3028
+ }));
3029
+ if (newPermissions.length > 0) {
3030
+ try {
3031
+ await permissionRepo.save(newPermissions);
3032
+ added = newPermissions.length;
3033
+ } catch (error) {
3034
+ if (error?.code === 'ER_DUP_ENTRY' || error?.message?.includes('Duplicate entry')) {
3035
+ throw new _nestjs_common__rspack_import_2.ConflictException({
3036
+ message: 'Some user-role permissions already exist. Please refresh and try again.',
3037
+ messageKey: _config_index_js__rspack_import_13/* .PERMISSION_OPERATION_MESSAGES.ALREADY_EXISTS */.P3.ALREADY_EXISTS
3038
+ });
3039
+ }
3040
+ throw error;
3041
+ }
3042
+ }
3043
+ }
3044
+ if (itemsToRemove.length > 0) {
3045
+ const roleIdsToRemove = itemsToRemove.map((item)=>item.id);
3046
+ const whereDelete = {
3047
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3048
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3049
+ sourceId: dto.userId,
3050
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
3051
+ targetId: (0,typeorm__rspack_import_3.In)(roleIdsToRemove)
3052
+ };
3053
+ if (enableCompanyFeature) {
3054
+ if (companyId) whereDelete.companyId = companyId;
3055
+ if (branchId) whereDelete.branchId = branchId;
3056
+ }
3057
+ const result = await permissionRepo.delete(whereDelete);
3058
+ removed = result.affected || 0;
3059
+ }
3060
+ await this.permissionCacheService.invalidateUser(dto.userId, enableCompanyFeature ? companyId : null, [
3061
+ branchId
3062
+ ]);
3063
+ const result = this.buildOperationResult(dto.items.length, added, removed);
3064
+ await this.publishAssignmentEvent(_config_index_js__rspack_import_16/* .IAM_EVENT_ENTITIES.USER_ROLE */.H.USER_ROLE, dto.userId, result);
3065
+ return result;
3066
+ }
3067
+ /** Get user's roles (branch-scoped, filtered by companyId and branchId if provided) */ async getUserRoles(userId, branchId, companyId) {
3068
+ const permissionRepo = await this.getPermissionRepository();
3069
+ const roleRepo = await this.getRoleRepository();
3070
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
3071
+ const where = {
3072
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3073
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3074
+ sourceId: userId
3075
+ };
3076
+ if (enableCompanyFeature) {
3077
+ if (companyId) where.companyId = companyId;
3078
+ if (branchId) where.branchId = branchId;
3079
+ }
3080
+ const permissions = await permissionRepo.find({
3081
+ where
3082
+ });
3083
+ if (permissions.length === 0) {
3084
+ return [];
3085
+ }
3086
+ const roleIds = permissions.map((p)=>p.targetId);
3087
+ const roleWhere = {
3088
+ id: (0,typeorm__rspack_import_3.In)(roleIds)
3089
+ };
3090
+ const roles = await roleRepo.find({
3091
+ where: roleWhere
3092
+ });
3093
+ const roleMap = new Map(roles.map((r)=>[
3094
+ r.id,
3095
+ r
3096
+ ]));
3097
+ return permissions.filter((p)=>roleMap.has(p.targetId)).map((p)=>{
3098
+ const role = roleMap.get(p.targetId);
3099
+ const permissionEntity = p;
3100
+ return {
3101
+ id: p.id,
3102
+ userId: p.sourceId,
3103
+ roleId: role.id,
3104
+ roleName: role.name,
3105
+ branchId: enableCompanyFeature ? permissionEntity.branchId ?? null : null,
3106
+ createdAt: p.createdAt
3107
+ };
3108
+ });
3109
+ }
3110
+ /** Get users assigned a role (reverse lookup: role -> users) */ async getUsersForRole(roleId) {
3111
+ const permissionRepo = await this.getPermissionRepository();
3112
+ const permissions = await permissionRepo.find({
3113
+ where: {
3114
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3115
+ targetType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
3116
+ targetId: roleId
3117
+ }
3118
+ });
3119
+ return permissions.map((p)=>({
3120
+ id: p.id,
3121
+ userId: p.sourceId,
3122
+ createdAt: p.createdAt
3123
+ }));
3124
+ }
3125
+ // Effective (Merged) Permissions — self-scoped, company-wide + branch-specific
3126
+ /** Get user's effective roles: company-wide (branchId null) merged with branch-specific */ async getUserEffectiveRoles(userId, companyId, branchId) {
3127
+ const permissionRepo = await this.getPermissionRepository();
3128
+ const roleRepo = await this.getRoleRepository();
3129
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
3130
+ const baseWhere = {
3131
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3132
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3133
+ sourceId: userId
3134
+ };
3135
+ if (enableCompanyFeature && companyId) baseWhere.companyId = companyId;
3136
+ const permissions = enableCompanyFeature && branchId ? await permissionRepo.find({
3137
+ where: [
3138
+ {
3139
+ ...baseWhere,
3140
+ branchId: (0,typeorm__rspack_import_3.IsNull)()
3141
+ },
3142
+ {
3143
+ ...baseWhere,
3144
+ branchId
3145
+ }
3146
+ ]
3147
+ }) : await permissionRepo.find({
3148
+ where: baseWhere
3149
+ });
3150
+ const validPermissions = permissions.filter((p)=>p.isValid());
3151
+ if (validPermissions.length === 0) {
3152
+ return [];
3153
+ }
3154
+ const roleIds = [
3155
+ ...new Set(validPermissions.map((p)=>p.targetId))
3156
+ ];
3157
+ const roles = await roleRepo.find({
3158
+ where: {
3159
+ id: (0,typeorm__rspack_import_3.In)(roleIds)
3160
+ }
3161
+ });
3162
+ const roleMap = new Map(roles.map((r)=>[
3163
+ r.id,
3164
+ r
3165
+ ]));
3166
+ return validPermissions.filter((p)=>roleMap.has(p.targetId)).map((p)=>{
3167
+ const role = roleMap.get(p.targetId);
3168
+ return {
3169
+ id: p.id,
3170
+ userId: p.sourceId,
3171
+ roleId: role.id,
3172
+ roleName: role.name,
3173
+ branchId: enableCompanyFeature ? p.branchId ?? null : null,
3174
+ createdAt: p.createdAt
3175
+ };
3176
+ });
3177
+ }
3178
+ /** Get user's effective actions: company-wide (branchId null) merged with branch-specific */ async getUserEffectiveActions(userId, companyId, branchId) {
3179
+ const permissionRepo = await this.getPermissionRepository();
3180
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
3181
+ const baseWhere = {
3182
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION,
3183
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3184
+ sourceId: userId
3185
+ };
3186
+ if (enableCompanyFeature && companyId) baseWhere.companyId = companyId;
3187
+ const permissions = enableCompanyFeature && branchId ? await permissionRepo.find({
3188
+ where: [
3189
+ {
3190
+ ...baseWhere,
3191
+ branchId: (0,typeorm__rspack_import_3.IsNull)()
3192
+ },
3193
+ {
3194
+ ...baseWhere,
3195
+ branchId
3196
+ }
3197
+ ]
3198
+ }) : await permissionRepo.find({
3199
+ where: baseWhere
3200
+ });
3201
+ const validPermissions = permissions.filter((p)=>p.isValid());
3202
+ if (validPermissions.length === 0) {
3203
+ return [];
3204
+ }
3205
+ const actionIds = [
3206
+ ...new Set(validPermissions.map((p)=>p.targetId))
3207
+ ];
3208
+ const actionMap = await this.getActionsMap(actionIds);
3209
+ return validPermissions.filter((p)=>actionMap.has(p.targetId)).map((p)=>{
3210
+ const action = actionMap.get(p.targetId);
3211
+ return {
3212
+ id: p.id,
3213
+ userId: p.sourceId,
3214
+ actionId: action.id,
3215
+ actionCode: action.code ?? '',
3216
+ actionName: action.name,
3217
+ companyId: ('companyId' in p ? p.companyId : null) ?? null,
3218
+ branchId: ('branchId' in p ? p.branchId : null) ?? null,
3219
+ createdAt: p.createdAt
3220
+ };
3221
+ });
3222
+ }
3223
+ // My Permissions
3224
+ /** Get user's effective permissions (cache-first approach) */ async getMyPermissions(userId, branchId, companyId, parentCodes) {
3225
+ return this.permissionCacheService.getMyPermissionsResponse(userId, branchId, companyId, parentCodes);
3226
+ }
3227
+ // Helper Methods
3228
+ /** Split permission items into add and remove arrays */ splitItemsByAction(items) {
3229
+ return {
3230
+ toAdd: items.filter((item)=>item.action === _dtos_permission_dto_js__rspack_import_4/* .PermissionAction.ADD */.aG.ADD),
3231
+ toRemove: items.filter((item)=>item.action === _dtos_permission_dto_js__rspack_import_4/* .PermissionAction.REMOVE */.aG.REMOVE)
3232
+ };
3233
+ }
3234
+ async publishAssignmentEvent(entity, targetId, result) {
3235
+ await (0,_flusys_nestjs_shared_classes__rspack_import_1.publishDomainEvent)({
3236
+ module: (/* inlined export .IAM_EVENT_MODULE */"iam"),
3237
+ entity,
3238
+ action: _config_index_js__rspack_import_16/* .IAM_EVENT_ACTIONS.PERMISSIONS_ASSIGNED */.X.PERMISSIONS_ASSIGNED,
3239
+ ids: [
3240
+ targetId
3241
+ ],
3242
+ metadata: {
3243
+ added: result.added,
3244
+ removed: result.removed,
3245
+ total: result.total
3246
+ }
3247
+ });
3248
+ }
3249
+ /** Build standard operation result DTO */ buildOperationResult(_totalItems, added, removed) {
3250
+ return {
3251
+ added,
3252
+ removed,
3253
+ total: _totalItems
3254
+ };
3255
+ }
3256
+ async revokeCompanyPermissions(companyId) {
3257
+ if (!this.iamConfigService.isCompanyFeatureEnabled()) {
3258
+ return;
3259
+ }
3260
+ const permissionRepo = await this.getPermissionRepository();
3261
+ const roleRepo = await this.getRoleRepository();
3262
+ const dataSource = await this.dataSourceProvider.getDataSource();
3263
+ const companyRoles = await roleRepo.find({
3264
+ where: {
3265
+ companyId,
3266
+ deletedAt: (0,typeorm__rspack_import_3.IsNull)()
3267
+ },
3268
+ select: [
3269
+ 'id'
3270
+ ]
3271
+ });
3272
+ const roleIds = companyRoles.map((role)=>role.id);
3273
+ const affectedUserRows = await permissionRepo.find({
3274
+ where: {
3275
+ permissionType: (0,typeorm__rspack_import_3.In)([
3276
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3277
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION
3278
+ ]),
3279
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3280
+ companyId
3281
+ },
3282
+ select: [
3283
+ 'sourceId'
3284
+ ]
3285
+ });
3286
+ const affectedUserIds = [
3287
+ ...new Set(affectedUserRows.map((row)=>row.sourceId))
3288
+ ];
3289
+ await dataSource.transaction(async (manager)=>{
3290
+ const txRepo = manager.getRepository(permissionRepo.target);
3291
+ await txRepo.delete({
3292
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.COMPANY_ACTION */.V.COMPANY_ACTION,
3293
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.COMPANY */.n.COMPANY,
3294
+ sourceId: companyId
3295
+ });
3296
+ if (roleIds.length > 0) {
3297
+ await txRepo.delete({
3298
+ permissionType: _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
3299
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.ROLE */.n.ROLE,
3300
+ sourceId: (0,typeorm__rspack_import_3.In)(roleIds)
3301
+ });
3302
+ }
3303
+ await txRepo.delete({
3304
+ permissionType: (0,typeorm__rspack_import_3.In)([
3305
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3306
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION
3307
+ ]),
3308
+ companyId
3309
+ });
3310
+ if (roleIds.length > 0) {
3311
+ const txRoleRepo = manager.getRepository(roleRepo.target);
3312
+ await txRoleRepo.delete(roleIds);
3313
+ }
3314
+ });
3315
+ if (affectedUserIds.length > 0) {
3316
+ await this.permissionCacheService.invalidateUsers(affectedUserIds, companyId);
3317
+ }
3318
+ }
3319
+ async revokeBranchPermissions(branchId, companyId) {
3320
+ if (!this.iamConfigService.isCompanyFeatureEnabled()) {
3321
+ return;
3322
+ }
3323
+ const permissionRepo = await this.getPermissionRepository();
3324
+ const where = {
3325
+ permissionType: (0,typeorm__rspack_import_3.In)([
3326
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3327
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION
3328
+ ]),
3329
+ companyId,
3330
+ branchId
3331
+ };
3332
+ const affectedUserRows = await permissionRepo.find({
3333
+ where: {
3334
+ ...where,
3335
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER
3336
+ },
3337
+ select: [
3338
+ 'sourceId'
3339
+ ]
3340
+ });
3341
+ const affectedUserIds = [
3342
+ ...new Set(affectedUserRows.map((row)=>row.sourceId))
3343
+ ];
3344
+ await permissionRepo.delete(where);
3345
+ if (affectedUserIds.length > 0) {
3346
+ await this.permissionCacheService.invalidateUsers(affectedUserIds, companyId, [
3347
+ branchId
3348
+ ]);
3349
+ }
3350
+ }
3351
+ async revokeUserCompanyAccess(userId, companyId) {
3352
+ const permissionRepo = await this.getPermissionRepository();
3353
+ await permissionRepo.delete({
3354
+ permissionType: (0,typeorm__rspack_import_3.In)([
3355
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3356
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION
3357
+ ]),
3358
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3359
+ sourceId: userId,
3360
+ companyId
3361
+ });
3362
+ await this.permissionCacheService.invalidateUser(userId, companyId);
3363
+ }
3364
+ async revokeUserBranchAccess(userId, branchId, companyId) {
3365
+ const permissionRepo = await this.getPermissionRepository();
3366
+ const where = {
3367
+ permissionType: (0,typeorm__rspack_import_3.In)([
3368
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3369
+ _enums_iam_permission_type_enum_js__rspack_import_14/* .IamPermissionType.USER_ACTION */.V.USER_ACTION
3370
+ ]),
3371
+ sourceType: _enums_iam_entity_type_enum_js__rspack_import_15/* .IamEntityType.USER */.n.USER,
3372
+ sourceId: userId,
3373
+ branchId,
3374
+ companyId
3375
+ };
3376
+ await permissionRepo.delete(where);
3377
+ await this.permissionCacheService.invalidateUser(userId, companyId, [
3378
+ branchId
3379
+ ]);
3380
+ }
3381
+ }
3382
+ _ts_decorate([
3383
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3384
+ action: 'iam.assignUserActions',
3385
+ module: 'iam'
3386
+ }),
3387
+ _ts_metadata("design:type", Function),
3388
+ _ts_metadata("design:paramtypes", [
3389
+ typeof _dtos_permission_dto_js__rspack_import_4/* .AssignUserActionsDto */.zs === "undefined" ? Object : _dtos_permission_dto_js__rspack_import_4/* .AssignUserActionsDto */.zs
3390
+ ]),
3391
+ _ts_metadata("design:returntype", Promise)
3392
+ ], PermissionService.prototype, "assignUserActions", null);
3393
+ _ts_decorate([
3394
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3395
+ action: 'iam.assignRoleActions',
3396
+ module: 'iam'
3397
+ }),
3398
+ _ts_metadata("design:type", Function),
3399
+ _ts_metadata("design:paramtypes", [
3400
+ typeof _dtos_permission_dto_js__rspack_import_4/* .AssignRoleActionsDto */.cv === "undefined" ? Object : _dtos_permission_dto_js__rspack_import_4/* .AssignRoleActionsDto */.cv
3401
+ ]),
3402
+ _ts_metadata("design:returntype", Promise)
3403
+ ], PermissionService.prototype, "assignRoleActions", null);
3404
+ _ts_decorate([
3405
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3406
+ action: 'iam.assignCompanyActions',
3407
+ module: 'iam'
3408
+ }),
3409
+ _ts_metadata("design:type", Function),
3410
+ _ts_metadata("design:paramtypes", [
3411
+ typeof _dtos_permission_dto_js__rspack_import_4/* .AssignCompanyActionsDto */.Nx === "undefined" ? Object : _dtos_permission_dto_js__rspack_import_4/* .AssignCompanyActionsDto */.Nx
3412
+ ]),
3413
+ _ts_metadata("design:returntype", Promise)
3414
+ ], PermissionService.prototype, "assignCompanyActions", null);
3415
+ _ts_decorate([
3416
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3417
+ action: 'iam.assignUserRoles',
3418
+ module: 'iam'
3419
+ }),
3420
+ _ts_metadata("design:type", Function),
3421
+ _ts_metadata("design:paramtypes", [
3422
+ typeof _dtos_permission_dto_js__rspack_import_4/* .AssignUserRolesDto */.Xz === "undefined" ? Object : _dtos_permission_dto_js__rspack_import_4/* .AssignUserRolesDto */.Xz
3423
+ ]),
3424
+ _ts_metadata("design:returntype", Promise)
3425
+ ], PermissionService.prototype, "assignUserRoles", null);
3426
+ _ts_decorate([
3427
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3428
+ action: 'iam.revokeCompanyPermissions',
3429
+ module: 'iam'
3430
+ }),
3431
+ _ts_metadata("design:type", Function),
3432
+ _ts_metadata("design:paramtypes", [
3433
+ String
3434
+ ]),
3435
+ _ts_metadata("design:returntype", Promise)
3436
+ ], PermissionService.prototype, "revokeCompanyPermissions", null);
3437
+ _ts_decorate([
3438
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3439
+ action: 'iam.revokeBranchPermissions',
3440
+ module: 'iam'
3441
+ }),
3442
+ _ts_metadata("design:type", Function),
3443
+ _ts_metadata("design:paramtypes", [
3444
+ String,
3445
+ String
3446
+ ]),
3447
+ _ts_metadata("design:returntype", Promise)
3448
+ ], PermissionService.prototype, "revokeBranchPermissions", null);
3449
+ _ts_decorate([
3450
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3451
+ action: 'iam.revokeUserCompanyAccess',
3452
+ module: 'iam'
3453
+ }),
3454
+ _ts_metadata("design:type", Function),
3455
+ _ts_metadata("design:paramtypes", [
3456
+ String,
3457
+ String
3458
+ ]),
3459
+ _ts_metadata("design:returntype", Promise)
3460
+ ], PermissionService.prototype, "revokeUserCompanyAccess", null);
3461
+ _ts_decorate([
3462
+ (0,_flusys_nestjs_shared__rspack_import_0.LogAction)({
3463
+ action: 'iam.revokeUserBranchAccess',
3464
+ module: 'iam'
3465
+ }),
3466
+ _ts_metadata("design:type", Function),
3467
+ _ts_metadata("design:paramtypes", [
3468
+ String,
3469
+ String,
3470
+ String
3471
+ ]),
3472
+ _ts_metadata("design:returntype", Promise)
3473
+ ], PermissionService.prototype, "revokeUserBranchAccess", null);
3474
+ PermissionService = _ts_decorate([
3475
+ (0,_nestjs_common__rspack_import_2.Injectable)({
3476
+ scope: _nestjs_common__rspack_import_2.Scope.REQUEST
3477
+ }),
3478
+ _ts_param(0, (0,_nestjs_common__rspack_import_2.Inject)(_permission_cache_service_js__rspack_import_12/* .PermissionCacheService */.D)),
3479
+ _ts_param(1, (0,_nestjs_common__rspack_import_2.Inject)(_iam_config_service_js__rspack_import_10/* .IAMConfigService */.N)),
3480
+ _ts_param(2, (0,_nestjs_common__rspack_import_2.Inject)(_iam_datasource_service_js__rspack_import_11/* .IAMDataSourceService */.U)),
3481
+ _ts_metadata("design:type", Function),
3482
+ _ts_metadata("design:paramtypes", [
3483
+ typeof _permission_cache_service_js__rspack_import_12/* .PermissionCacheService */.D === "undefined" ? Object : _permission_cache_service_js__rspack_import_12/* .PermissionCacheService */.D,
3484
+ typeof _iam_config_service_js__rspack_import_10/* .IAMConfigService */.N === "undefined" ? Object : _iam_config_service_js__rspack_import_10/* .IAMConfigService */.N,
3485
+ typeof _iam_datasource_service_js__rspack_import_11/* .IAMDataSourceService */.U === "undefined" ? Object : _iam_datasource_service_js__rspack_import_11/* .IAMDataSourceService */.U
3486
+ ])
3487
+ ], PermissionService);
3488
+
3489
+ __webpack_require__.d(__webpack_exports__, {
3490
+ n: () => (PermissionService)
3491
+ });
3492
+
3493
+
3494
+ },
3495
+ 446(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
3496
+
3497
+ // EXPORTS
3498
+ __webpack_require__.d(__webpack_exports__, {
3499
+ W: () => (/* binding */ RoleService)
3500
+ });
3501
+
3502
+ // EXTERNAL MODULE: external "@flusys/nestjs-shared/classes"
3503
+ var classes_ = __webpack_require__(937);
3504
+ // EXTERNAL MODULE: external "@flusys/nestjs-shared/modules"
3505
+ var modules_ = __webpack_require__(236);
3506
+ ;// CONCATENATED MODULE: external "@flusys/nestjs-shared/utils"
3507
+
3508
+ // EXTERNAL MODULE: external "@nestjs/common"
3509
+ var common_ = __webpack_require__(157);
3510
+ // EXTERNAL MODULE: external "typeorm"
3511
+ var external_typeorm_ = __webpack_require__(158);
3512
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/config/event-actions.ts
3513
+ var event_actions = __webpack_require__(916);
3514
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/config/message-keys.ts
3515
+ var message_keys = __webpack_require__(490);
3516
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/permission-with-company.entity.ts
3517
+ var permission_with_company_entity = __webpack_require__(746);
3518
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/role-with-company.entity.ts
3519
+ var role_with_company_entity = __webpack_require__(353);
3520
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/role.entity.ts
3521
+ var role_entity = __webpack_require__(326);
3522
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/entities/user-iam-permission.entity.ts
3523
+ var user_iam_permission_entity = __webpack_require__(489);
3524
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/enums/iam-entity-type.enum.ts
3525
+ var iam_entity_type_enum = __webpack_require__(85);
3526
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/enums/iam-permission-type.enum.ts
3527
+ var iam_permission_type_enum = __webpack_require__(517);
3528
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/services/iam-config.service.ts
3529
+ var iam_config_service = __webpack_require__(645);
3530
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/services/iam-datasource.service.ts + 1 modules
3531
+ var iam_datasource_service = __webpack_require__(831);
3532
+ // EXTERNAL MODULE: ./projects/nestjs-iam/src/services/permission-cache.service.ts + 1 modules
3533
+ var permission_cache_service = __webpack_require__(99);
3534
+ ;// CONCATENATED MODULE: ./projects/nestjs-iam/src/services/role.service.ts
3535
+ function _ts_decorate(decorators, target, key, desc) {
3536
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3537
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") {
3538
+ r = Reflect.decorate(decorators, target, key, desc);
3539
+ } else {
3540
+ for(var i = decorators.length - 1; i >= 0; i--){
3541
+ if (d = decorators[i]) {
3542
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3543
+ }
3544
+ }
3545
+ }
3546
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
3547
+ }
3548
+ function _ts_metadata(metadataKey, metadataValue) {
3549
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") {
3550
+ return Reflect.metadata(metadataKey, metadataValue);
3551
+ }
3552
+ }
3553
+ function _ts_param(paramIndex, decorator) {
3554
+ return function(target, key) {
3555
+ decorator(target, key, paramIndex);
3556
+ };
3557
+ }
3558
+
3559
+
3560
+
3561
+
3562
+
3563
+
3564
+
3565
+
3566
+
3567
+
3568
+
3569
+
3570
+
3571
+
3572
+
3573
+ class RoleService extends classes_.ApiService {
3574
+ cacheManager;
3575
+ utilsService;
3576
+ iamConfigService;
3577
+ permissionCacheService;
3578
+ constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionCacheService){
3579
+ super(event_actions/* .IAM_EVENT_ENTITIES.ROLE */.H.ROLE, cacheManager, utilsService, RoleService.name, true, (/* inlined export .IAM_EVENT_MODULE */"iam"), dataSourceProvider, iamConfigService.isCompanyFeatureEnabled() ? role_with_company_entity/* .RoleWithCompany */.g : role_entity/* .Role */.X), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionCacheService = permissionCacheService;
3580
+ }
3581
+ async beforeUpdateOperation(dto, _user, _queryRunner) {
3582
+ const dtos = Array.isArray(dto) ? dto : [
3583
+ dto
3584
+ ];
3585
+ const ids = dtos.map((d)=>d.id);
3586
+ await this.ensureDataSourceRepository();
3587
+ const readonlyRoles = await this.repository.find({
3588
+ where: {
3589
+ id: (0,external_typeorm_.In)(ids),
3590
+ readOnly: true,
3591
+ deletedAt: (0,external_typeorm_.IsNull)()
3592
+ }
3593
+ });
3594
+ if (readonlyRoles.length > 0) {
3595
+ const names = readonlyRoles.map((r)=>r.name).join(', ');
3596
+ throw new common_.ForbiddenException({
3597
+ message: `Cannot modify readonly role(s): ${names}`,
3598
+ messageKey: message_keys/* .ROLE_MESSAGES.READONLY_UPDATE_FORBIDDEN */.QW.READONLY_UPDATE_FORBIDDEN,
3599
+ messageVariables: {
3600
+ names
3601
+ }
3602
+ });
3603
+ }
3604
+ }
3605
+ async beforeDeleteOperation(dto, user, queryRunner) {
3606
+ await super.beforeDeleteOperation(dto, user, queryRunner);
3607
+ const roleIds = Array.isArray(dto.id) ? dto.id : [
3608
+ dto.id
3609
+ ];
3610
+ if (roleIds.length === 0) {
3611
+ return;
3612
+ }
3613
+ await this.ensureDataSourceRepository();
3614
+ const readonlyRoles = await this.repository.find({
3615
+ where: {
3616
+ id: (0,external_typeorm_.In)(roleIds),
3617
+ readOnly: true,
3618
+ deletedAt: (0,external_typeorm_.IsNull)()
3619
+ }
3620
+ });
3621
+ if (readonlyRoles.length > 0) {
3622
+ const names = readonlyRoles.map((r)=>r.name).join(', ');
3623
+ throw new common_.ForbiddenException({
3624
+ message: `Cannot delete readonly role(s): ${names}`,
3625
+ messageKey: message_keys/* .ROLE_MESSAGES.READONLY_DELETE_FORBIDDEN */.QW.READONLY_DELETE_FORBIDDEN,
3626
+ messageVariables: {
3627
+ names
3628
+ }
3629
+ });
3630
+ }
3631
+ const enableCompanyFeature = this.iamConfigService.isCompanyFeatureEnabled();
3632
+ const permissionEntity = enableCompanyFeature ? permission_with_company_entity/* .UserIamPermissionWithCompany */.t : user_iam_permission_entity/* .UserIamPermission */.y;
3633
+ const permissionRepo = queryRunner.manager.getRepository(permissionEntity);
3634
+ const userRoleRows = await permissionRepo.find({
3635
+ where: {
3636
+ permissionType: iam_permission_type_enum/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3637
+ sourceType: iam_entity_type_enum/* .IamEntityType.USER */.n.USER,
3638
+ targetType: iam_entity_type_enum/* .IamEntityType.ROLE */.n.ROLE,
3639
+ targetId: (0,external_typeorm_.In)(roleIds)
3640
+ }
3641
+ });
3642
+ const affectedUserIds = [
3643
+ ...new Set(userRoleRows.map((row)=>row.sourceId))
3644
+ ];
3645
+ await permissionRepo.delete({
3646
+ permissionType: iam_permission_type_enum/* .IamPermissionType.ROLE_ACTION */.V.ROLE_ACTION,
3647
+ sourceType: iam_entity_type_enum/* .IamEntityType.ROLE */.n.ROLE,
3648
+ sourceId: (0,external_typeorm_.In)(roleIds)
3649
+ });
3650
+ await permissionRepo.delete({
3651
+ permissionType: iam_permission_type_enum/* .IamPermissionType.USER_ROLE */.V.USER_ROLE,
3652
+ targetType: iam_entity_type_enum/* .IamEntityType.ROLE */.n.ROLE,
3653
+ targetId: (0,external_typeorm_.In)(roleIds)
3654
+ });
3655
+ if (affectedUserIds.length > 0) {
3656
+ await this.permissionCacheService.invalidateUsers(affectedUserIds);
3657
+ }
3658
+ }
3659
+ // Entity Conversion
3660
+ async convertSingleDtoToEntity(dto, user) {
3661
+ const entity = await super.convertSingleDtoToEntity(dto, user);
3662
+ // Handle companyId based on company feature
3663
+ if (this.iamConfigService.isCompanyFeatureEnabled()) {
3664
+ const isUpdate = 'id' in dto && dto.id;
3665
+ // For create: use dto.companyId or user's companyId
3666
+ // For update: only override if explicitly provided
3667
+ if (!isUpdate || dto.companyId !== undefined) {
3668
+ entity.companyId = dto.companyId ?? user?.companyId ?? null;
3669
+ }
3670
+ }
3671
+ return entity;
3672
+ }
3673
+ // Query Customization
3674
+ async getSelectQuery(query, _user, select) {
3675
+ if (!select?.length) {
3676
+ select = [
3677
+ 'id',
3678
+ 'name',
3679
+ 'description',
3680
+ 'isActive',
3681
+ 'readOnly',
3682
+ 'serial',
3683
+ 'createdAt'
3684
+ ];
3685
+ if (this.iamConfigService.isCompanyFeatureEnabled()) {
3686
+ select.push('companyId');
3687
+ }
3688
+ }
3689
+ query.select(select.map((f)=>`${this.entityName}.${f}`));
3690
+ return {
3691
+ query,
3692
+ isRaw: false
3693
+ };
3694
+ }
3695
+ async getGlobalSearchQuery(query, search) {
3696
+ query.andWhere('(role.name LIKE :search OR role.description LIKE :search)', {
3697
+ search: `%${search}%`
3698
+ });
3699
+ return {
3700
+ query,
3701
+ isRaw: false
3702
+ };
3703
+ }
3704
+ async getExtraManipulateQuery(query, filterDto, user) {
3705
+ const result = await super.getExtraManipulateQuery(query, filterDto, user);
3706
+ (0,__rspack_external__flusys_nestjs_shared_utils_9125c1f1.applyCompanyFilter)(query, {
3707
+ isCompanyFeatureEnabled: this.iamConfigService.isCompanyFeatureEnabled(),
3708
+ entityAlias: 'role'
3709
+ }, user);
3710
+ return result;
3711
+ }
3712
+ // Response Conversion
3713
+ convertEntityToResponseDto(entity, _isRaw) {
3714
+ return {
3715
+ id: entity.id,
3716
+ readOnly: entity.readOnly,
3717
+ name: entity.name,
3718
+ description: entity.description,
3719
+ isActive: entity.isActive,
3720
+ serial: entity.serial,
3721
+ companyId: ('companyId' in entity ? entity.companyId : null) ?? null,
3722
+ createdAt: entity.createdAt,
3723
+ updatedAt: entity.updatedAt,
3724
+ deletedAt: entity.deletedAt,
3725
+ createdById: entity.createdById,
3726
+ updatedById: entity.updatedById,
3727
+ deletedById: entity.deletedById
3728
+ };
3729
+ }
3730
+ }
3731
+ RoleService = _ts_decorate([
3732
+ (0,common_.Injectable)({
3733
+ scope: common_.Scope.REQUEST
3734
+ }),
3735
+ _ts_param(0, (0,common_.Inject)('CACHE_INSTANCE')),
3736
+ _ts_param(1, (0,common_.Inject)(modules_.UtilsService)),
3737
+ _ts_param(2, (0,common_.Inject)(iam_config_service/* .IAMConfigService */.N)),
3738
+ _ts_param(3, (0,common_.Inject)(iam_datasource_service/* .IAMDataSourceService */.U)),
3739
+ _ts_param(4, (0,common_.Inject)(permission_cache_service/* .PermissionCacheService */.D)),
3740
+ _ts_metadata("design:type", Function),
3741
+ _ts_metadata("design:paramtypes", [
3742
+ typeof classes_.HybridCache === "undefined" ? Object : classes_.HybridCache,
3743
+ typeof modules_.UtilsService === "undefined" ? Object : modules_.UtilsService,
3744
+ typeof iam_config_service/* .IAMConfigService */.N === "undefined" ? Object : iam_config_service/* .IAMConfigService */.N,
3745
+ typeof iam_datasource_service/* .IAMDataSourceService */.U === "undefined" ? Object : iam_datasource_service/* .IAMDataSourceService */.U,
3746
+ typeof permission_cache_service/* .PermissionCacheService */.D === "undefined" ? Object : permission_cache_service/* .PermissionCacheService */.D
3747
+ ])
3748
+ ], RoleService);
3749
+
3750
+
3751
+ },
3752
+ 422(module) {
3753
+
3754
+ module.exports = __rspack_external__flusys_nestjs_shared_393d2cae;
3755
+
3756
+
3757
+ },
3758
+ 937(module) {
3759
+
3760
+ module.exports = __rspack_external__flusys_nestjs_shared_classes_6076a329;
3761
+
3762
+
3763
+ },
3764
+ 236(module) {
3765
+
3766
+ module.exports = __rspack_external__flusys_nestjs_shared_modules_24702bee;
3767
+
3768
+
3769
+ },
3770
+ 157(module) {
3771
+
3772
+ module.exports = __rspack_external__nestjs_common_a04939da;
3773
+
3774
+
3775
+ },
3776
+ 176(module) {
3777
+
3778
+ module.exports = __rspack_external__nestjs_swagger_7cd450b5;
3779
+
3780
+
3781
+ },
3782
+ 812(module) {
3783
+
3784
+ module.exports = __rspack_external_class_transformer_c5a479fb;
3785
+
3786
+
3787
+ },
3788
+ 421(module) {
3789
+
3790
+ module.exports = __rspack_external_class_validator_7b99ef4d;
3791
+
3792
+
3793
+ },
3794
+ 158(module) {
3795
+
3796
+ module.exports = __rspack_external_typeorm;
3797
+
3798
+
3799
+ },
3800
+
3801
+ };