@flusys/nestjs-iam 7.1.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/index.d.ts +3 -3
- package/config/message-keys.d.ts +2 -0
- package/controllers/action.controller.d.ts +4 -4
- package/controllers/company-action-permission.controller.d.ts +2 -2
- package/controllers/index.d.ts +6 -6
- package/controllers/my-permission.controller.d.ts +3 -3
- package/controllers/role-permission.controller.d.ts +5 -4
- package/controllers/role.controller.d.ts +2 -2
- package/controllers/user-action-permission.controller.d.ts +5 -4
- package/docs/iam-swagger.config.d.ts +2 -2
- package/docs/index.d.ts +1 -1
- package/dtos/action.dto.d.ts +2 -2
- package/dtos/index.d.ts +3 -3
- package/dtos/permission.dto.d.ts +16 -0
- package/entities/action.entity.d.ts +2 -2
- package/entities/index.d.ts +11 -11
- package/entities/permission-with-company.entity.d.ts +1 -1
- package/entities/role-with-company.entity.d.ts +1 -1
- package/entities/role.entity.d.ts +1 -1
- package/entities/user-iam-permission.entity.d.ts +1 -1
- package/enums/index.d.ts +4 -4
- package/fesm/284.js +1316 -0
- package/fesm/867.js +3801 -0
- package/fesm/chunks/364.js +86 -0
- package/fesm/config/index.js +135 -3
- package/fesm/controllers/index.js +18 -7
- package/fesm/docs/index.js +240 -1
- package/fesm/dtos/index.js +1168 -3
- package/fesm/entities/index.js +670 -31
- package/fesm/enums/index.js +97 -4
- package/fesm/helpers/index.js +125 -2
- package/fesm/index.js +818 -11
- package/fesm/interfaces/index.js +17 -3
- package/fesm/modules/index.js +259 -1
- package/fesm/runtime.js +134 -0
- package/fesm/services/index.js +43 -6
- package/fesm/types/index.js +15 -1
- package/helpers/company-access.helper.d.ts +2 -2
- package/helpers/index.d.ts +2 -2
- package/helpers/permission-mode.helper.d.ts +1 -1
- package/index.d.ts +11 -11
- package/interfaces/action.interface.d.ts +2 -2
- package/interfaces/iam-module-options.interface.d.ts +3 -3
- package/interfaces/index.d.ts +3 -3
- package/modules/iam.module.d.ts +2 -2
- package/modules/index.d.ts +1 -1
- package/package.json +30 -37
- package/services/action.service.d.ts +9 -9
- package/services/iam-config.service.d.ts +4 -4
- package/services/iam-datasource.service.d.ts +3 -3
- package/services/index.d.ts +6 -6
- package/services/permission-cache.service.d.ts +5 -5
- package/services/permission.service.d.ts +6 -4
- package/services/role.service.d.ts +8 -8
- package/types/index.d.ts +1 -1
- package/cjs/config/event-actions.js +0 -36
- package/cjs/config/iam.constants.js +0 -11
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -71
- package/cjs/controllers/action.controller.js +0 -174
- package/cjs/controllers/action.controller.spec.js +0 -79
- package/cjs/controllers/company-action-permission.controller.js +0 -119
- package/cjs/controllers/company-action-permission.controller.spec.js +0 -65
- package/cjs/controllers/index.js +0 -23
- package/cjs/controllers/my-permission.controller.js +0 -147
- package/cjs/controllers/my-permission.controller.spec.js +0 -128
- package/cjs/controllers/role-permission.controller.js +0 -191
- package/cjs/controllers/role-permission.controller.spec.js +0 -140
- package/cjs/controllers/role.controller.js +0 -102
- package/cjs/controllers/role.controller.spec.js +0 -86
- package/cjs/controllers/user-action-permission.controller.js +0 -129
- package/cjs/controllers/user-action-permission.controller.spec.js +0 -68
- package/cjs/docs/iam-swagger.config.js +0 -209
- package/cjs/docs/iam-swagger.config.spec.js +0 -99
- package/cjs/docs/index.js +0 -18
- package/cjs/dtos/action.dto.js +0 -282
- package/cjs/dtos/index.js +0 -21
- package/cjs/dtos/permission.dto.js +0 -637
- package/cjs/dtos/role.dto.js +0 -155
- package/cjs/entities/action.entity.js +0 -138
- package/cjs/entities/index.js +0 -80
- package/cjs/entities/index.spec.js +0 -56
- package/cjs/entities/permission-base.entity.js +0 -107
- package/cjs/entities/permission-with-company.entity.js +0 -100
- package/cjs/entities/role-base.entity.js +0 -80
- package/cjs/entities/role-with-company.entity.js +0 -55
- package/cjs/entities/role.entity.js +0 -25
- package/cjs/entities/user-iam-permission.entity.js +0 -43
- package/cjs/enums/action-type.enum.js +0 -22
- package/cjs/enums/iam-entity-type.enum.js +0 -17
- package/cjs/enums/iam-permission-type.enum.js +0 -17
- package/cjs/enums/index.js +0 -21
- package/cjs/enums/permission-type.enum.js +0 -16
- package/cjs/helpers/company-access.helper.js +0 -23
- package/cjs/helpers/company-access.helper.spec.js +0 -68
- package/cjs/helpers/index.js +0 -19
- package/cjs/helpers/permission-mode.helper.js +0 -49
- package/cjs/helpers/permission-mode.helper.spec.js +0 -54
- package/cjs/index.js +0 -28
- package/cjs/interfaces/action.interface.js +0 -4
- package/cjs/interfaces/iam-module-options.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -20
- package/cjs/interfaces/role.interface.js +0 -7
- package/cjs/modules/iam.module.js +0 -186
- package/cjs/modules/iam.module.spec.js +0 -282
- package/cjs/modules/index.js +0 -18
- package/cjs/services/action.service.js +0 -337
- package/cjs/services/action.service.spec.js +0 -351
- package/cjs/services/iam-config.service.js +0 -87
- package/cjs/services/iam-config.service.spec.js +0 -110
- package/cjs/services/iam-datasource.service.js +0 -129
- package/cjs/services/iam-datasource.service.spec.js +0 -110
- package/cjs/services/index.js +0 -23
- package/cjs/services/permission-cache.service.js +0 -544
- package/cjs/services/permission-cache.service.spec.js +0 -718
- package/cjs/services/permission.service.js +0 -914
- package/cjs/services/permission.service.spec.js +0 -918
- package/cjs/services/role.service.js +0 -224
- package/cjs/services/role.service.spec.js +0 -347
- package/cjs/types/index.js +0 -18
- package/cjs/types/logic-node.type.js +0 -30
- package/fesm/config/event-actions.js +0 -15
- package/fesm/config/iam.constants.js +0 -1
- package/fesm/config/message-keys.js +0 -35
- package/fesm/controllers/action.controller.js +0 -164
- package/fesm/controllers/action.controller.spec.js +0 -75
- package/fesm/controllers/company-action-permission.controller.js +0 -109
- package/fesm/controllers/company-action-permission.controller.spec.js +0 -61
- package/fesm/controllers/my-permission.controller.js +0 -137
- package/fesm/controllers/my-permission.controller.spec.js +0 -124
- package/fesm/controllers/role-permission.controller.js +0 -181
- package/fesm/controllers/role-permission.controller.spec.js +0 -136
- package/fesm/controllers/role.controller.js +0 -92
- package/fesm/controllers/role.controller.spec.js +0 -82
- package/fesm/controllers/user-action-permission.controller.js +0 -119
- package/fesm/controllers/user-action-permission.controller.spec.js +0 -64
- package/fesm/docs/iam-swagger.config.js +0 -199
- package/fesm/docs/iam-swagger.config.spec.js +0 -95
- package/fesm/dtos/action.dto.js +0 -252
- package/fesm/dtos/permission.dto.js +0 -571
- package/fesm/dtos/role.dto.js +0 -134
- package/fesm/entities/action.entity.js +0 -128
- package/fesm/entities/index.spec.js +0 -52
- package/fesm/entities/permission-base.entity.js +0 -100
- package/fesm/entities/permission-with-company.entity.js +0 -90
- package/fesm/entities/role-base.entity.js +0 -70
- package/fesm/entities/role-with-company.entity.js +0 -45
- package/fesm/entities/role.entity.js +0 -15
- package/fesm/entities/user-iam-permission.entity.js +0 -33
- package/fesm/enums/action-type.enum.js +0 -12
- package/fesm/enums/iam-entity-type.enum.js +0 -7
- package/fesm/enums/iam-permission-type.enum.js +0 -7
- package/fesm/enums/permission-type.enum.js +0 -6
- package/fesm/helpers/company-access.helper.js +0 -18
- package/fesm/helpers/company-access.helper.spec.js +0 -64
- package/fesm/helpers/permission-mode.helper.js +0 -49
- package/fesm/helpers/permission-mode.helper.spec.js +0 -50
- package/fesm/interfaces/action.interface.js +0 -3
- package/fesm/interfaces/iam-module-options.interface.js +0 -3
- package/fesm/interfaces/role.interface.js +0 -4
- package/fesm/modules/iam.module.js +0 -176
- package/fesm/modules/iam.module.spec.js +0 -278
- package/fesm/services/action.service.js +0 -327
- package/fesm/services/action.service.spec.js +0 -347
- package/fesm/services/iam-config.service.js +0 -77
- package/fesm/services/iam-config.service.spec.js +0 -106
- package/fesm/services/iam-datasource.service.js +0 -78
- package/fesm/services/iam-datasource.service.spec.js +0 -106
- package/fesm/services/permission-cache.service.js +0 -527
- package/fesm/services/permission-cache.service.spec.js +0 -714
- package/fesm/services/permission.service.js +0 -904
- package/fesm/services/permission.service.spec.js +0 -914
- package/fesm/services/role.service.js +0 -214
- package/fesm/services/role.service.spec.js +0 -343
- package/fesm/types/logic-node.type.js +0 -27
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
|
+
};
|