@flusys/nestjs-iam 5.1.1 → 5.1.3
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/cjs/dtos/action.dto.js +15 -54
- package/cjs/dtos/role.dto.js +11 -51
- package/cjs/services/action.service.js +5 -11
- package/cjs/services/iam-datasource.service.js +0 -56
- package/cjs/services/role.service.js +2 -5
- package/dtos/action.dto.d.ts +2 -8
- package/dtos/role.dto.d.ts +2 -8
- package/fesm/dtos/action.dto.js +15 -54
- package/fesm/dtos/role.dto.js +11 -51
- package/fesm/services/action.service.js +6 -12
- package/fesm/services/iam-datasource.service.js +1 -57
- package/fesm/services/role.service.js +3 -6
- package/package.json +11 -11
- package/services/action.service.d.ts +3 -6
- package/services/iam-datasource.service.d.ts +0 -2
- package/services/role.service.d.ts +2 -4
package/cjs/dtos/action.dto.js
CHANGED
|
@@ -25,7 +25,9 @@ _export(exports, {
|
|
|
25
25
|
return UpdateActionDto;
|
|
26
26
|
}
|
|
27
27
|
});
|
|
28
|
+
const _dtos = require("@flusys/nestjs-shared/dtos");
|
|
28
29
|
const _swagger = require("@nestjs/swagger");
|
|
30
|
+
const _classtransformer = require("class-transformer");
|
|
29
31
|
const _classvalidator = require("class-validator");
|
|
30
32
|
const _enums = require("../enums");
|
|
31
33
|
const _types = require("../types");
|
|
@@ -158,106 +160,65 @@ _ts_decorate([
|
|
|
158
160
|
(0, _classvalidator.IsNotEmpty)(),
|
|
159
161
|
_ts_metadata("design:type", String)
|
|
160
162
|
], UpdateActionDto.prototype, "id", void 0);
|
|
161
|
-
let ActionResponseDto = class ActionResponseDto {
|
|
162
|
-
constructor(){
|
|
163
|
-
_define_property(this, "
|
|
164
|
-
_define_property(this, "readOnly", void 0);
|
|
165
|
-
_define_property(this, "name", void 0);
|
|
166
|
-
_define_property(this, "description", void 0);
|
|
167
|
-
_define_property(this, "code", void 0);
|
|
168
|
-
_define_property(this, "actionType", void 0);
|
|
169
|
-
_define_property(this, "permissionLogic", void 0);
|
|
170
|
-
_define_property(this, "parentId", void 0);
|
|
171
|
-
_define_property(this, "serial", void 0);
|
|
172
|
-
_define_property(this, "isActive", void 0);
|
|
173
|
-
_define_property(this, "createdAt", void 0);
|
|
174
|
-
_define_property(this, "updatedAt", void 0);
|
|
175
|
-
_define_property(this, "deletedAt", void 0);
|
|
176
|
-
_define_property(this, "createdById", void 0);
|
|
177
|
-
_define_property(this, "updatedById", void 0);
|
|
178
|
-
_define_property(this, "deletedById", void 0);
|
|
163
|
+
let ActionResponseDto = class ActionResponseDto extends _dtos.IdentityResponseDto {
|
|
164
|
+
constructor(...args){
|
|
165
|
+
super(...args), _define_property(this, "readOnly", void 0), _define_property(this, "name", void 0), _define_property(this, "description", void 0), _define_property(this, "code", void 0), _define_property(this, "actionType", void 0), _define_property(this, "permissionLogic", void 0), _define_property(this, "parentId", void 0), _define_property(this, "serial", void 0), _define_property(this, "isActive", void 0);
|
|
179
166
|
}
|
|
180
167
|
};
|
|
181
168
|
_ts_decorate([
|
|
182
|
-
(0,
|
|
183
|
-
_ts_metadata("design:type", String)
|
|
184
|
-
], ActionResponseDto.prototype, "id", void 0);
|
|
185
|
-
_ts_decorate([
|
|
169
|
+
(0, _classtransformer.Expose)(),
|
|
186
170
|
(0, _swagger.ApiProperty)(),
|
|
187
171
|
_ts_metadata("design:type", Boolean)
|
|
188
172
|
], ActionResponseDto.prototype, "readOnly", void 0);
|
|
189
173
|
_ts_decorate([
|
|
174
|
+
(0, _classtransformer.Expose)(),
|
|
190
175
|
(0, _swagger.ApiProperty)(),
|
|
191
176
|
_ts_metadata("design:type", String)
|
|
192
177
|
], ActionResponseDto.prototype, "name", void 0);
|
|
193
178
|
_ts_decorate([
|
|
179
|
+
(0, _classtransformer.Expose)(),
|
|
194
180
|
(0, _swagger.ApiProperty)(),
|
|
195
181
|
_ts_metadata("design:type", Object)
|
|
196
182
|
], ActionResponseDto.prototype, "description", void 0);
|
|
197
183
|
_ts_decorate([
|
|
184
|
+
(0, _classtransformer.Expose)(),
|
|
198
185
|
(0, _swagger.ApiProperty)(),
|
|
199
186
|
_ts_metadata("design:type", Object)
|
|
200
187
|
], ActionResponseDto.prototype, "code", void 0);
|
|
201
188
|
_ts_decorate([
|
|
189
|
+
(0, _classtransformer.Expose)(),
|
|
202
190
|
(0, _swagger.ApiProperty)({
|
|
203
191
|
enum: _enums.ActionType
|
|
204
192
|
}),
|
|
205
193
|
_ts_metadata("design:type", typeof _enums.ActionType === "undefined" ? Object : _enums.ActionType)
|
|
206
194
|
], ActionResponseDto.prototype, "actionType", void 0);
|
|
207
195
|
_ts_decorate([
|
|
196
|
+
(0, _classtransformer.Expose)(),
|
|
208
197
|
(0, _swagger.ApiProperty)(),
|
|
209
198
|
_ts_metadata("design:type", Object)
|
|
210
199
|
], ActionResponseDto.prototype, "permissionLogic", void 0);
|
|
211
200
|
_ts_decorate([
|
|
201
|
+
(0, _classtransformer.Expose)(),
|
|
212
202
|
(0, _swagger.ApiProperty)(),
|
|
213
203
|
_ts_metadata("design:type", Object)
|
|
214
204
|
], ActionResponseDto.prototype, "parentId", void 0);
|
|
215
205
|
_ts_decorate([
|
|
206
|
+
(0, _classtransformer.Expose)(),
|
|
216
207
|
(0, _swagger.ApiProperty)(),
|
|
217
208
|
_ts_metadata("design:type", Object)
|
|
218
209
|
], ActionResponseDto.prototype, "serial", void 0);
|
|
219
210
|
_ts_decorate([
|
|
211
|
+
(0, _classtransformer.Expose)(),
|
|
220
212
|
(0, _swagger.ApiProperty)(),
|
|
221
213
|
_ts_metadata("design:type", Boolean)
|
|
222
214
|
], ActionResponseDto.prototype, "isActive", void 0);
|
|
223
|
-
_ts_decorate([
|
|
224
|
-
(0, _swagger.ApiProperty)(),
|
|
225
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
226
|
-
], ActionResponseDto.prototype, "createdAt", void 0);
|
|
227
|
-
_ts_decorate([
|
|
228
|
-
(0, _swagger.ApiProperty)(),
|
|
229
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
230
|
-
], ActionResponseDto.prototype, "updatedAt", void 0);
|
|
231
|
-
_ts_decorate([
|
|
232
|
-
(0, _swagger.ApiProperty)({
|
|
233
|
-
required: false
|
|
234
|
-
}),
|
|
235
|
-
_ts_metadata("design:type", Object)
|
|
236
|
-
], ActionResponseDto.prototype, "deletedAt", void 0);
|
|
237
|
-
_ts_decorate([
|
|
238
|
-
(0, _swagger.ApiProperty)({
|
|
239
|
-
required: false
|
|
240
|
-
}),
|
|
241
|
-
_ts_metadata("design:type", Object)
|
|
242
|
-
], ActionResponseDto.prototype, "createdById", void 0);
|
|
243
|
-
_ts_decorate([
|
|
244
|
-
(0, _swagger.ApiProperty)({
|
|
245
|
-
required: false
|
|
246
|
-
}),
|
|
247
|
-
_ts_metadata("design:type", Object)
|
|
248
|
-
], ActionResponseDto.prototype, "updatedById", void 0);
|
|
249
|
-
_ts_decorate([
|
|
250
|
-
(0, _swagger.ApiProperty)({
|
|
251
|
-
required: false
|
|
252
|
-
}),
|
|
253
|
-
_ts_metadata("design:type", Object)
|
|
254
|
-
], ActionResponseDto.prototype, "deletedById", void 0);
|
|
255
215
|
let ActionTreeDto = class ActionTreeDto extends ActionResponseDto {
|
|
256
216
|
constructor(...args){
|
|
257
217
|
super(...args), _define_property(this, "children", void 0);
|
|
258
218
|
}
|
|
259
219
|
};
|
|
260
220
|
_ts_decorate([
|
|
221
|
+
(0, _classtransformer.Expose)(),
|
|
261
222
|
(0, _swagger.ApiProperty)({
|
|
262
223
|
type: ()=>[
|
|
263
224
|
ActionTreeDto
|
package/cjs/dtos/role.dto.js
CHANGED
|
@@ -19,7 +19,9 @@ _export(exports, {
|
|
|
19
19
|
return UpdateRoleDto;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
+
const _dtos = require("@flusys/nestjs-shared/dtos");
|
|
22
23
|
const _swagger = require("@nestjs/swagger");
|
|
24
|
+
const _classtransformer = require("class-transformer");
|
|
23
25
|
const _classvalidator = require("class-validator");
|
|
24
26
|
function _define_property(obj, key, value) {
|
|
25
27
|
if (key in obj) {
|
|
@@ -116,80 +118,38 @@ _ts_decorate([
|
|
|
116
118
|
(0, _classvalidator.IsNotEmpty)(),
|
|
117
119
|
_ts_metadata("design:type", String)
|
|
118
120
|
], UpdateRoleDto.prototype, "id", void 0);
|
|
119
|
-
let RoleResponseDto = class RoleResponseDto {
|
|
120
|
-
constructor(){
|
|
121
|
-
_define_property(this, "
|
|
122
|
-
_define_property(this, "readOnly", void 0);
|
|
123
|
-
_define_property(this, "name", void 0);
|
|
124
|
-
_define_property(this, "description", void 0);
|
|
125
|
-
_define_property(this, "companyId", void 0);
|
|
126
|
-
_define_property(this, "isActive", void 0);
|
|
127
|
-
_define_property(this, "serial", void 0);
|
|
128
|
-
_define_property(this, "createdAt", void 0);
|
|
129
|
-
_define_property(this, "updatedAt", void 0);
|
|
130
|
-
_define_property(this, "deletedAt", void 0);
|
|
131
|
-
_define_property(this, "createdById", void 0);
|
|
132
|
-
_define_property(this, "updatedById", void 0);
|
|
133
|
-
_define_property(this, "deletedById", void 0);
|
|
121
|
+
let RoleResponseDto = class RoleResponseDto extends _dtos.IdentityResponseDto {
|
|
122
|
+
constructor(...args){
|
|
123
|
+
super(...args), _define_property(this, "readOnly", void 0), _define_property(this, "name", void 0), _define_property(this, "description", void 0), _define_property(this, "companyId", void 0), _define_property(this, "isActive", void 0), _define_property(this, "serial", void 0);
|
|
134
124
|
}
|
|
135
125
|
};
|
|
136
126
|
_ts_decorate([
|
|
137
|
-
(0,
|
|
138
|
-
_ts_metadata("design:type", String)
|
|
139
|
-
], RoleResponseDto.prototype, "id", void 0);
|
|
140
|
-
_ts_decorate([
|
|
127
|
+
(0, _classtransformer.Expose)(),
|
|
141
128
|
(0, _swagger.ApiProperty)(),
|
|
142
129
|
_ts_metadata("design:type", Boolean)
|
|
143
130
|
], RoleResponseDto.prototype, "readOnly", void 0);
|
|
144
131
|
_ts_decorate([
|
|
132
|
+
(0, _classtransformer.Expose)(),
|
|
145
133
|
(0, _swagger.ApiProperty)(),
|
|
146
134
|
_ts_metadata("design:type", String)
|
|
147
135
|
], RoleResponseDto.prototype, "name", void 0);
|
|
148
136
|
_ts_decorate([
|
|
137
|
+
(0, _classtransformer.Expose)(),
|
|
149
138
|
(0, _swagger.ApiProperty)(),
|
|
150
139
|
_ts_metadata("design:type", Object)
|
|
151
140
|
], RoleResponseDto.prototype, "description", void 0);
|
|
152
141
|
_ts_decorate([
|
|
142
|
+
(0, _classtransformer.Expose)(),
|
|
153
143
|
(0, _swagger.ApiProperty)(),
|
|
154
144
|
_ts_metadata("design:type", Object)
|
|
155
145
|
], RoleResponseDto.prototype, "companyId", void 0);
|
|
156
146
|
_ts_decorate([
|
|
147
|
+
(0, _classtransformer.Expose)(),
|
|
157
148
|
(0, _swagger.ApiProperty)(),
|
|
158
149
|
_ts_metadata("design:type", Boolean)
|
|
159
150
|
], RoleResponseDto.prototype, "isActive", void 0);
|
|
160
151
|
_ts_decorate([
|
|
152
|
+
(0, _classtransformer.Expose)(),
|
|
161
153
|
(0, _swagger.ApiProperty)(),
|
|
162
154
|
_ts_metadata("design:type", Object)
|
|
163
155
|
], RoleResponseDto.prototype, "serial", void 0);
|
|
164
|
-
_ts_decorate([
|
|
165
|
-
(0, _swagger.ApiProperty)(),
|
|
166
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
167
|
-
], RoleResponseDto.prototype, "createdAt", void 0);
|
|
168
|
-
_ts_decorate([
|
|
169
|
-
(0, _swagger.ApiProperty)(),
|
|
170
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
171
|
-
], RoleResponseDto.prototype, "updatedAt", void 0);
|
|
172
|
-
_ts_decorate([
|
|
173
|
-
(0, _swagger.ApiProperty)({
|
|
174
|
-
required: false
|
|
175
|
-
}),
|
|
176
|
-
_ts_metadata("design:type", Object)
|
|
177
|
-
], RoleResponseDto.prototype, "deletedAt", void 0);
|
|
178
|
-
_ts_decorate([
|
|
179
|
-
(0, _swagger.ApiProperty)({
|
|
180
|
-
required: false
|
|
181
|
-
}),
|
|
182
|
-
_ts_metadata("design:type", Object)
|
|
183
|
-
], RoleResponseDto.prototype, "createdById", void 0);
|
|
184
|
-
_ts_decorate([
|
|
185
|
-
(0, _swagger.ApiProperty)({
|
|
186
|
-
required: false
|
|
187
|
-
}),
|
|
188
|
-
_ts_metadata("design:type", Object)
|
|
189
|
-
], RoleResponseDto.prototype, "updatedById", void 0);
|
|
190
|
-
_ts_decorate([
|
|
191
|
-
(0, _swagger.ApiProperty)({
|
|
192
|
-
required: false
|
|
193
|
-
}),
|
|
194
|
-
_ts_metadata("design:type", Object)
|
|
195
|
-
], RoleResponseDto.prototype, "deletedById", void 0);
|
|
@@ -44,13 +44,7 @@ function _ts_param(paramIndex, decorator) {
|
|
|
44
44
|
decorator(target, key, paramIndex);
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
let ActionService = class ActionService extends _classes.
|
|
48
|
-
resolveEntity() {
|
|
49
|
-
return _actionentity.Action;
|
|
50
|
-
}
|
|
51
|
-
getDataSourceProvider() {
|
|
52
|
-
return this.dataSourceProvider;
|
|
53
|
-
}
|
|
47
|
+
let ActionService = class ActionService extends _classes.ApiService {
|
|
54
48
|
// Query Customization
|
|
55
49
|
async getSelectQuery(query, _user, select) {
|
|
56
50
|
if (!select?.length) {
|
|
@@ -115,7 +109,7 @@ let ActionService = class ActionService extends _classes.RequestScopedApiService
|
|
|
115
109
|
}
|
|
116
110
|
}
|
|
117
111
|
/** Get actions available for permission assignment (filtered by company whitelist) */ async getActionsForPermission(user) {
|
|
118
|
-
await this.
|
|
112
|
+
await this.ensureDataSourceRepository();
|
|
119
113
|
this.requireUser(user, 'getActionsForPermission');
|
|
120
114
|
let whereClause = {};
|
|
121
115
|
if (this.iamConfigService.isCompanyFeatureEnabled() && user.companyId) {
|
|
@@ -134,7 +128,7 @@ let ActionService = class ActionService extends _classes.RequestScopedApiService
|
|
|
134
128
|
return actions.map((action)=>this.convertEntityToResponseDto(action, false));
|
|
135
129
|
}
|
|
136
130
|
/** Get actions in hierarchical tree structure */ async getActionTree(user, search, isActive, withDeleted = false) {
|
|
137
|
-
await this.
|
|
131
|
+
await this.ensureDataSourceRepository();
|
|
138
132
|
this.requireUser(user, 'getActionTree');
|
|
139
133
|
const query = this.repository.createQueryBuilder('action');
|
|
140
134
|
if (!withDeleted) {
|
|
@@ -183,8 +177,8 @@ let ActionService = class ActionService extends _classes.RequestScopedApiService
|
|
|
183
177
|
return rootNodes;
|
|
184
178
|
}
|
|
185
179
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionService){
|
|
186
|
-
super('action',
|
|
187
|
-
_define_property(this, "actionSelectFields", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.
|
|
180
|
+
super('action', cacheManager, utilsService, ActionService.name, true, 'iam', _actionentity.Action, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), _define_property(this, "permissionService", void 0), // Custom Methods
|
|
181
|
+
_define_property(this, "actionSelectFields", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionService = permissionService, this.actionSelectFields = [
|
|
188
182
|
'id',
|
|
189
183
|
'code',
|
|
190
184
|
'name',
|
|
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "IAMDataSourceService", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _modules = require("@flusys/nestjs-shared/modules");
|
|
12
|
-
const _constants = require("@flusys/nestjs-shared/constants");
|
|
13
12
|
const _common = require("@nestjs/common");
|
|
14
13
|
const _core = require("@nestjs/core");
|
|
15
14
|
const _express = require("express");
|
|
@@ -84,7 +83,6 @@ function _ts_param(paramIndex, decorator) {
|
|
|
84
83
|
};
|
|
85
84
|
}
|
|
86
85
|
let IAMDataSourceService = class IAMDataSourceService extends _modules.MultiTenantDataSourceService {
|
|
87
|
-
// Factory Methods
|
|
88
86
|
static buildParentOptions(options) {
|
|
89
87
|
return {
|
|
90
88
|
bootstrapAppConfig: options.bootstrapAppConfig,
|
|
@@ -93,80 +91,26 @@ let IAMDataSourceService = class IAMDataSourceService extends _modules.MultiTena
|
|
|
93
91
|
tenants: options.config?.tenants
|
|
94
92
|
};
|
|
95
93
|
}
|
|
96
|
-
// Feature Flags
|
|
97
94
|
getEnableCompanyFeatureForTenant(tenant) {
|
|
98
95
|
return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
99
96
|
}
|
|
100
97
|
getEnableCompanyFeatureForCurrentTenant() {
|
|
101
98
|
return this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
|
|
102
99
|
}
|
|
103
|
-
// Entity Management
|
|
104
100
|
async getIAMEntities() {
|
|
105
101
|
const { getIAMEntitiesByConfig } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")));
|
|
106
102
|
const enableCompanyFeature = this.getEnableCompanyFeatureForCurrentTenant();
|
|
107
103
|
const permissionMode = _helpers.PermissionModeHelper.toString(this.configService.getPermissionMode());
|
|
108
104
|
return getIAMEntitiesByConfig(enableCompanyFeature, permissionMode);
|
|
109
105
|
}
|
|
110
|
-
// Overrides
|
|
111
106
|
async createDataSourceFromConfig(config) {
|
|
112
107
|
const entities = await this.getIAMEntities();
|
|
113
108
|
return await super.createDataSourceFromConfig(config, entities);
|
|
114
109
|
}
|
|
115
|
-
async getSingleDataSource() {
|
|
116
|
-
if (!IAMDataSourceService.singleDataSource) {
|
|
117
|
-
if (IAMDataSourceService.singleConnectionLock) {
|
|
118
|
-
return IAMDataSourceService.singleConnectionLock;
|
|
119
|
-
}
|
|
120
|
-
const lockPromise = (async ()=>{
|
|
121
|
-
const config = this.getDefaultDatabaseConfig();
|
|
122
|
-
if (!config) {
|
|
123
|
-
throw new _common.InternalServerErrorException({
|
|
124
|
-
message: 'Default database config is not available',
|
|
125
|
-
messageKey: _constants.SYSTEM_MESSAGES.DATABASE_CONFIG_NOT_AVAILABLE
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
const ds = await this.createDataSourceFromConfig(config);
|
|
129
|
-
IAMDataSourceService.singleDataSource = ds;
|
|
130
|
-
IAMDataSourceService.initialized = true;
|
|
131
|
-
return ds;
|
|
132
|
-
})();
|
|
133
|
-
IAMDataSourceService.singleConnectionLock = lockPromise;
|
|
134
|
-
try {
|
|
135
|
-
return await lockPromise;
|
|
136
|
-
} finally{
|
|
137
|
-
IAMDataSourceService.singleConnectionLock = null;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return IAMDataSourceService.singleDataSource;
|
|
141
|
-
}
|
|
142
|
-
async getOrCreateTenantConnection(tenant) {
|
|
143
|
-
// Return existing initialized connection from IAM-specific cache
|
|
144
|
-
const existing = IAMDataSourceService.tenantConnections.get(tenant.id);
|
|
145
|
-
if (existing?.isInitialized) {
|
|
146
|
-
return existing;
|
|
147
|
-
}
|
|
148
|
-
// If another request is creating this tenant's connection, wait for it
|
|
149
|
-
const pendingConnection = IAMDataSourceService.connectionLocks.get(tenant.id);
|
|
150
|
-
if (pendingConnection) {
|
|
151
|
-
return pendingConnection;
|
|
152
|
-
}
|
|
153
|
-
// Create connection with lock to prevent race conditions
|
|
154
|
-
const config = this.buildTenantDatabaseConfig(tenant);
|
|
155
|
-
const connectionPromise = this.createDataSourceFromConfig(config);
|
|
156
|
-
IAMDataSourceService.connectionLocks.set(tenant.id, connectionPromise);
|
|
157
|
-
try {
|
|
158
|
-
const dataSource = await connectionPromise;
|
|
159
|
-
IAMDataSourceService.tenantConnections.set(tenant.id, dataSource);
|
|
160
|
-
return dataSource;
|
|
161
|
-
} finally{
|
|
162
|
-
IAMDataSourceService.connectionLocks.delete(tenant.id);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
110
|
constructor(configService, request){
|
|
166
111
|
super(IAMDataSourceService.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), this.configService = configService;
|
|
167
112
|
}
|
|
168
113
|
};
|
|
169
|
-
// Override parent's static properties to have IAM-specific cache
|
|
170
114
|
_define_property(IAMDataSourceService, "tenantConnections", new Map());
|
|
171
115
|
_define_property(IAMDataSourceService, "singleDataSource", null);
|
|
172
116
|
_define_property(IAMDataSourceService, "tenantsRegistry", new Map());
|
|
@@ -43,13 +43,10 @@ function _ts_param(paramIndex, decorator) {
|
|
|
43
43
|
decorator(target, key, paramIndex);
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
|
-
let RoleService = class RoleService extends _classes.
|
|
46
|
+
let RoleService = class RoleService extends _classes.ApiService {
|
|
47
47
|
resolveEntity() {
|
|
48
48
|
return this.iamConfigService.isCompanyFeatureEnabled() ? _rolewithcompanyentity.RoleWithCompany : _roleentity.Role;
|
|
49
49
|
}
|
|
50
|
-
getDataSourceProvider() {
|
|
51
|
-
return this.dataSourceProvider;
|
|
52
|
-
}
|
|
53
50
|
// Entity Conversion
|
|
54
51
|
async convertSingleDtoToEntity(dto, user) {
|
|
55
52
|
const entity = await super.convertSingleDtoToEntity(dto, user);
|
|
@@ -121,7 +118,7 @@ let RoleService = class RoleService extends _classes.RequestScopedApiService {
|
|
|
121
118
|
};
|
|
122
119
|
}
|
|
123
120
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider){
|
|
124
|
-
super('role',
|
|
121
|
+
super('role', cacheManager, utilsService, RoleService.name, true, 'iam', undefined, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService;
|
|
125
122
|
}
|
|
126
123
|
};
|
|
127
124
|
RoleService = _ts_decorate([
|
package/dtos/action.dto.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
|
|
1
2
|
import { ActionType } from '../enums';
|
|
2
3
|
import { LogicNode } from '../types';
|
|
3
4
|
export declare class CreateActionDto {
|
|
@@ -14,8 +15,7 @@ declare const UpdateActionDto_base: import("@nestjs/common").Type<Partial<Create
|
|
|
14
15
|
export declare class UpdateActionDto extends UpdateActionDto_base {
|
|
15
16
|
id: string;
|
|
16
17
|
}
|
|
17
|
-
export declare class ActionResponseDto {
|
|
18
|
-
id: string;
|
|
18
|
+
export declare class ActionResponseDto extends IdentityResponseDto {
|
|
19
19
|
readOnly: boolean;
|
|
20
20
|
name: string;
|
|
21
21
|
description: string | null;
|
|
@@ -25,12 +25,6 @@ export declare class ActionResponseDto {
|
|
|
25
25
|
parentId: string | null;
|
|
26
26
|
serial: number | null;
|
|
27
27
|
isActive: boolean;
|
|
28
|
-
createdAt: Date;
|
|
29
|
-
updatedAt: Date;
|
|
30
|
-
deletedAt: Date | null;
|
|
31
|
-
createdById: string | null;
|
|
32
|
-
updatedById: string | null;
|
|
33
|
-
deletedById: string | null;
|
|
34
28
|
}
|
|
35
29
|
export declare class ActionTreeDto extends ActionResponseDto {
|
|
36
30
|
children: ActionTreeDto[];
|
package/dtos/role.dto.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
|
|
1
2
|
export declare class CreateRoleDto {
|
|
2
3
|
name: string;
|
|
3
4
|
description?: string;
|
|
@@ -9,19 +10,12 @@ declare const UpdateRoleDto_base: import("@nestjs/common").Type<Partial<CreateRo
|
|
|
9
10
|
export declare class UpdateRoleDto extends UpdateRoleDto_base {
|
|
10
11
|
id: string;
|
|
11
12
|
}
|
|
12
|
-
export declare class RoleResponseDto {
|
|
13
|
-
id: string;
|
|
13
|
+
export declare class RoleResponseDto extends IdentityResponseDto {
|
|
14
14
|
readOnly: boolean;
|
|
15
15
|
name: string;
|
|
16
16
|
description: string | null;
|
|
17
17
|
companyId: string | null;
|
|
18
18
|
isActive: boolean;
|
|
19
19
|
serial: number | null;
|
|
20
|
-
createdAt: Date;
|
|
21
|
-
updatedAt: Date;
|
|
22
|
-
deletedAt: Date | null;
|
|
23
|
-
createdById: string | null;
|
|
24
|
-
updatedById: string | null;
|
|
25
|
-
deletedById: string | null;
|
|
26
20
|
}
|
|
27
21
|
export {};
|
package/fesm/dtos/action.dto.js
CHANGED
|
@@ -20,7 +20,9 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
20
20
|
function _ts_metadata(k, v) {
|
|
21
21
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
22
|
}
|
|
23
|
+
import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
|
|
23
24
|
import { ApiProperty, PartialType } from '@nestjs/swagger';
|
|
25
|
+
import { Expose } from 'class-transformer';
|
|
24
26
|
import { IsBoolean, IsEnum, IsInt, IsNotEmpty, IsOptional, IsString, IsUUID, MaxLength } from 'class-validator';
|
|
25
27
|
import { ActionType } from '../enums';
|
|
26
28
|
import { LogicNode } from '../types';
|
|
@@ -131,106 +133,65 @@ _ts_decorate([
|
|
|
131
133
|
IsNotEmpty(),
|
|
132
134
|
_ts_metadata("design:type", String)
|
|
133
135
|
], UpdateActionDto.prototype, "id", void 0);
|
|
134
|
-
export class ActionResponseDto {
|
|
135
|
-
constructor(){
|
|
136
|
-
_define_property(this, "
|
|
137
|
-
_define_property(this, "readOnly", void 0);
|
|
138
|
-
_define_property(this, "name", void 0);
|
|
139
|
-
_define_property(this, "description", void 0);
|
|
140
|
-
_define_property(this, "code", void 0);
|
|
141
|
-
_define_property(this, "actionType", void 0);
|
|
142
|
-
_define_property(this, "permissionLogic", void 0);
|
|
143
|
-
_define_property(this, "parentId", void 0);
|
|
144
|
-
_define_property(this, "serial", void 0);
|
|
145
|
-
_define_property(this, "isActive", void 0);
|
|
146
|
-
_define_property(this, "createdAt", void 0);
|
|
147
|
-
_define_property(this, "updatedAt", void 0);
|
|
148
|
-
_define_property(this, "deletedAt", void 0);
|
|
149
|
-
_define_property(this, "createdById", void 0);
|
|
150
|
-
_define_property(this, "updatedById", void 0);
|
|
151
|
-
_define_property(this, "deletedById", void 0);
|
|
136
|
+
export class ActionResponseDto extends IdentityResponseDto {
|
|
137
|
+
constructor(...args){
|
|
138
|
+
super(...args), _define_property(this, "readOnly", void 0), _define_property(this, "name", void 0), _define_property(this, "description", void 0), _define_property(this, "code", void 0), _define_property(this, "actionType", void 0), _define_property(this, "permissionLogic", void 0), _define_property(this, "parentId", void 0), _define_property(this, "serial", void 0), _define_property(this, "isActive", void 0);
|
|
152
139
|
}
|
|
153
140
|
}
|
|
154
141
|
_ts_decorate([
|
|
155
|
-
|
|
156
|
-
_ts_metadata("design:type", String)
|
|
157
|
-
], ActionResponseDto.prototype, "id", void 0);
|
|
158
|
-
_ts_decorate([
|
|
142
|
+
Expose(),
|
|
159
143
|
ApiProperty(),
|
|
160
144
|
_ts_metadata("design:type", Boolean)
|
|
161
145
|
], ActionResponseDto.prototype, "readOnly", void 0);
|
|
162
146
|
_ts_decorate([
|
|
147
|
+
Expose(),
|
|
163
148
|
ApiProperty(),
|
|
164
149
|
_ts_metadata("design:type", String)
|
|
165
150
|
], ActionResponseDto.prototype, "name", void 0);
|
|
166
151
|
_ts_decorate([
|
|
152
|
+
Expose(),
|
|
167
153
|
ApiProperty(),
|
|
168
154
|
_ts_metadata("design:type", Object)
|
|
169
155
|
], ActionResponseDto.prototype, "description", void 0);
|
|
170
156
|
_ts_decorate([
|
|
157
|
+
Expose(),
|
|
171
158
|
ApiProperty(),
|
|
172
159
|
_ts_metadata("design:type", Object)
|
|
173
160
|
], ActionResponseDto.prototype, "code", void 0);
|
|
174
161
|
_ts_decorate([
|
|
162
|
+
Expose(),
|
|
175
163
|
ApiProperty({
|
|
176
164
|
enum: ActionType
|
|
177
165
|
}),
|
|
178
166
|
_ts_metadata("design:type", typeof ActionType === "undefined" ? Object : ActionType)
|
|
179
167
|
], ActionResponseDto.prototype, "actionType", void 0);
|
|
180
168
|
_ts_decorate([
|
|
169
|
+
Expose(),
|
|
181
170
|
ApiProperty(),
|
|
182
171
|
_ts_metadata("design:type", Object)
|
|
183
172
|
], ActionResponseDto.prototype, "permissionLogic", void 0);
|
|
184
173
|
_ts_decorate([
|
|
174
|
+
Expose(),
|
|
185
175
|
ApiProperty(),
|
|
186
176
|
_ts_metadata("design:type", Object)
|
|
187
177
|
], ActionResponseDto.prototype, "parentId", void 0);
|
|
188
178
|
_ts_decorate([
|
|
179
|
+
Expose(),
|
|
189
180
|
ApiProperty(),
|
|
190
181
|
_ts_metadata("design:type", Object)
|
|
191
182
|
], ActionResponseDto.prototype, "serial", void 0);
|
|
192
183
|
_ts_decorate([
|
|
184
|
+
Expose(),
|
|
193
185
|
ApiProperty(),
|
|
194
186
|
_ts_metadata("design:type", Boolean)
|
|
195
187
|
], ActionResponseDto.prototype, "isActive", void 0);
|
|
196
|
-
_ts_decorate([
|
|
197
|
-
ApiProperty(),
|
|
198
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
199
|
-
], ActionResponseDto.prototype, "createdAt", void 0);
|
|
200
|
-
_ts_decorate([
|
|
201
|
-
ApiProperty(),
|
|
202
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
203
|
-
], ActionResponseDto.prototype, "updatedAt", void 0);
|
|
204
|
-
_ts_decorate([
|
|
205
|
-
ApiProperty({
|
|
206
|
-
required: false
|
|
207
|
-
}),
|
|
208
|
-
_ts_metadata("design:type", Object)
|
|
209
|
-
], ActionResponseDto.prototype, "deletedAt", void 0);
|
|
210
|
-
_ts_decorate([
|
|
211
|
-
ApiProperty({
|
|
212
|
-
required: false
|
|
213
|
-
}),
|
|
214
|
-
_ts_metadata("design:type", Object)
|
|
215
|
-
], ActionResponseDto.prototype, "createdById", void 0);
|
|
216
|
-
_ts_decorate([
|
|
217
|
-
ApiProperty({
|
|
218
|
-
required: false
|
|
219
|
-
}),
|
|
220
|
-
_ts_metadata("design:type", Object)
|
|
221
|
-
], ActionResponseDto.prototype, "updatedById", void 0);
|
|
222
|
-
_ts_decorate([
|
|
223
|
-
ApiProperty({
|
|
224
|
-
required: false
|
|
225
|
-
}),
|
|
226
|
-
_ts_metadata("design:type", Object)
|
|
227
|
-
], ActionResponseDto.prototype, "deletedById", void 0);
|
|
228
188
|
export class ActionTreeDto extends ActionResponseDto {
|
|
229
189
|
constructor(...args){
|
|
230
190
|
super(...args), _define_property(this, "children", void 0);
|
|
231
191
|
}
|
|
232
192
|
}
|
|
233
193
|
_ts_decorate([
|
|
194
|
+
Expose(),
|
|
234
195
|
ApiProperty({
|
|
235
196
|
type: ()=>[
|
|
236
197
|
ActionTreeDto
|
package/fesm/dtos/role.dto.js
CHANGED
|
@@ -20,7 +20,9 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
20
20
|
function _ts_metadata(k, v) {
|
|
21
21
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
22
|
}
|
|
23
|
+
import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
|
|
23
24
|
import { ApiProperty, PartialType } from '@nestjs/swagger';
|
|
25
|
+
import { Expose } from 'class-transformer';
|
|
24
26
|
import { IsBoolean, IsInt, IsNotEmpty, IsOptional, IsString, IsUUID, MaxLength } from 'class-validator';
|
|
25
27
|
export class CreateRoleDto {
|
|
26
28
|
constructor(){
|
|
@@ -95,80 +97,38 @@ _ts_decorate([
|
|
|
95
97
|
IsNotEmpty(),
|
|
96
98
|
_ts_metadata("design:type", String)
|
|
97
99
|
], UpdateRoleDto.prototype, "id", void 0);
|
|
98
|
-
export class RoleResponseDto {
|
|
99
|
-
constructor(){
|
|
100
|
-
_define_property(this, "
|
|
101
|
-
_define_property(this, "readOnly", void 0);
|
|
102
|
-
_define_property(this, "name", void 0);
|
|
103
|
-
_define_property(this, "description", void 0);
|
|
104
|
-
_define_property(this, "companyId", void 0);
|
|
105
|
-
_define_property(this, "isActive", void 0);
|
|
106
|
-
_define_property(this, "serial", void 0);
|
|
107
|
-
_define_property(this, "createdAt", void 0);
|
|
108
|
-
_define_property(this, "updatedAt", void 0);
|
|
109
|
-
_define_property(this, "deletedAt", void 0);
|
|
110
|
-
_define_property(this, "createdById", void 0);
|
|
111
|
-
_define_property(this, "updatedById", void 0);
|
|
112
|
-
_define_property(this, "deletedById", void 0);
|
|
100
|
+
export class RoleResponseDto extends IdentityResponseDto {
|
|
101
|
+
constructor(...args){
|
|
102
|
+
super(...args), _define_property(this, "readOnly", void 0), _define_property(this, "name", void 0), _define_property(this, "description", void 0), _define_property(this, "companyId", void 0), _define_property(this, "isActive", void 0), _define_property(this, "serial", void 0);
|
|
113
103
|
}
|
|
114
104
|
}
|
|
115
105
|
_ts_decorate([
|
|
116
|
-
|
|
117
|
-
_ts_metadata("design:type", String)
|
|
118
|
-
], RoleResponseDto.prototype, "id", void 0);
|
|
119
|
-
_ts_decorate([
|
|
106
|
+
Expose(),
|
|
120
107
|
ApiProperty(),
|
|
121
108
|
_ts_metadata("design:type", Boolean)
|
|
122
109
|
], RoleResponseDto.prototype, "readOnly", void 0);
|
|
123
110
|
_ts_decorate([
|
|
111
|
+
Expose(),
|
|
124
112
|
ApiProperty(),
|
|
125
113
|
_ts_metadata("design:type", String)
|
|
126
114
|
], RoleResponseDto.prototype, "name", void 0);
|
|
127
115
|
_ts_decorate([
|
|
116
|
+
Expose(),
|
|
128
117
|
ApiProperty(),
|
|
129
118
|
_ts_metadata("design:type", Object)
|
|
130
119
|
], RoleResponseDto.prototype, "description", void 0);
|
|
131
120
|
_ts_decorate([
|
|
121
|
+
Expose(),
|
|
132
122
|
ApiProperty(),
|
|
133
123
|
_ts_metadata("design:type", Object)
|
|
134
124
|
], RoleResponseDto.prototype, "companyId", void 0);
|
|
135
125
|
_ts_decorate([
|
|
126
|
+
Expose(),
|
|
136
127
|
ApiProperty(),
|
|
137
128
|
_ts_metadata("design:type", Boolean)
|
|
138
129
|
], RoleResponseDto.prototype, "isActive", void 0);
|
|
139
130
|
_ts_decorate([
|
|
131
|
+
Expose(),
|
|
140
132
|
ApiProperty(),
|
|
141
133
|
_ts_metadata("design:type", Object)
|
|
142
134
|
], RoleResponseDto.prototype, "serial", void 0);
|
|
143
|
-
_ts_decorate([
|
|
144
|
-
ApiProperty(),
|
|
145
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
146
|
-
], RoleResponseDto.prototype, "createdAt", void 0);
|
|
147
|
-
_ts_decorate([
|
|
148
|
-
ApiProperty(),
|
|
149
|
-
_ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
|
|
150
|
-
], RoleResponseDto.prototype, "updatedAt", void 0);
|
|
151
|
-
_ts_decorate([
|
|
152
|
-
ApiProperty({
|
|
153
|
-
required: false
|
|
154
|
-
}),
|
|
155
|
-
_ts_metadata("design:type", Object)
|
|
156
|
-
], RoleResponseDto.prototype, "deletedAt", void 0);
|
|
157
|
-
_ts_decorate([
|
|
158
|
-
ApiProperty({
|
|
159
|
-
required: false
|
|
160
|
-
}),
|
|
161
|
-
_ts_metadata("design:type", Object)
|
|
162
|
-
], RoleResponseDto.prototype, "createdById", void 0);
|
|
163
|
-
_ts_decorate([
|
|
164
|
-
ApiProperty({
|
|
165
|
-
required: false
|
|
166
|
-
}),
|
|
167
|
-
_ts_metadata("design:type", Object)
|
|
168
|
-
], RoleResponseDto.prototype, "updatedById", void 0);
|
|
169
|
-
_ts_decorate([
|
|
170
|
-
ApiProperty({
|
|
171
|
-
required: false
|
|
172
|
-
}),
|
|
173
|
-
_ts_metadata("design:type", Object)
|
|
174
|
-
], RoleResponseDto.prototype, "deletedById", void 0);
|
|
@@ -25,7 +25,7 @@ function _ts_param(paramIndex, decorator) {
|
|
|
25
25
|
decorator(target, key, paramIndex);
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
-
import { HybridCache,
|
|
28
|
+
import { HybridCache, ApiService } from '@flusys/nestjs-shared/classes';
|
|
29
29
|
import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
30
30
|
import { BadRequestException, Inject, Injectable, Scope } from '@nestjs/common';
|
|
31
31
|
import { In } from 'typeorm';
|
|
@@ -34,13 +34,7 @@ import { Action } from '../entities/action.entity';
|
|
|
34
34
|
import { IAMConfigService } from './iam-config.service';
|
|
35
35
|
import { IAMDataSourceService } from './iam-datasource.service';
|
|
36
36
|
import { PermissionService } from './permission.service';
|
|
37
|
-
export class ActionService extends
|
|
38
|
-
resolveEntity() {
|
|
39
|
-
return Action;
|
|
40
|
-
}
|
|
41
|
-
getDataSourceProvider() {
|
|
42
|
-
return this.dataSourceProvider;
|
|
43
|
-
}
|
|
37
|
+
export class ActionService extends ApiService {
|
|
44
38
|
// Query Customization
|
|
45
39
|
async getSelectQuery(query, _user, select) {
|
|
46
40
|
if (!select?.length) {
|
|
@@ -105,7 +99,7 @@ export class ActionService extends RequestScopedApiService {
|
|
|
105
99
|
}
|
|
106
100
|
}
|
|
107
101
|
/** Get actions available for permission assignment (filtered by company whitelist) */ async getActionsForPermission(user) {
|
|
108
|
-
await this.
|
|
102
|
+
await this.ensureDataSourceRepository();
|
|
109
103
|
this.requireUser(user, 'getActionsForPermission');
|
|
110
104
|
let whereClause = {};
|
|
111
105
|
if (this.iamConfigService.isCompanyFeatureEnabled() && user.companyId) {
|
|
@@ -124,7 +118,7 @@ export class ActionService extends RequestScopedApiService {
|
|
|
124
118
|
return actions.map((action)=>this.convertEntityToResponseDto(action, false));
|
|
125
119
|
}
|
|
126
120
|
/** Get actions in hierarchical tree structure */ async getActionTree(user, search, isActive, withDeleted = false) {
|
|
127
|
-
await this.
|
|
121
|
+
await this.ensureDataSourceRepository();
|
|
128
122
|
this.requireUser(user, 'getActionTree');
|
|
129
123
|
const query = this.repository.createQueryBuilder('action');
|
|
130
124
|
if (!withDeleted) {
|
|
@@ -173,8 +167,8 @@ export class ActionService extends RequestScopedApiService {
|
|
|
173
167
|
return rootNodes;
|
|
174
168
|
}
|
|
175
169
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionService){
|
|
176
|
-
super('action',
|
|
177
|
-
_define_property(this, "actionSelectFields", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.
|
|
170
|
+
super('action', cacheManager, utilsService, ActionService.name, true, 'iam', Action, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), _define_property(this, "permissionService", void 0), // Custom Methods
|
|
171
|
+
_define_property(this, "actionSelectFields", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionService = permissionService, this.actionSelectFields = [
|
|
178
172
|
'id',
|
|
179
173
|
'code',
|
|
180
174
|
'name',
|
|
@@ -26,14 +26,12 @@ function _ts_param(paramIndex, decorator) {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
import { MultiTenantDataSourceService } from '@flusys/nestjs-shared/modules';
|
|
29
|
-
import {
|
|
30
|
-
import { Inject, Injectable, InternalServerErrorException, Optional, Scope } from '@nestjs/common';
|
|
29
|
+
import { Inject, Injectable, Optional, Scope } from '@nestjs/common';
|
|
31
30
|
import { REQUEST } from '@nestjs/core';
|
|
32
31
|
import { Request } from 'express';
|
|
33
32
|
import { PermissionModeHelper } from '../helpers';
|
|
34
33
|
import { IAMConfigService } from './iam-config.service';
|
|
35
34
|
export class IAMDataSourceService extends MultiTenantDataSourceService {
|
|
36
|
-
// Factory Methods
|
|
37
35
|
static buildParentOptions(options) {
|
|
38
36
|
return {
|
|
39
37
|
bootstrapAppConfig: options.bootstrapAppConfig,
|
|
@@ -42,80 +40,26 @@ export class IAMDataSourceService extends MultiTenantDataSourceService {
|
|
|
42
40
|
tenants: options.config?.tenants
|
|
43
41
|
};
|
|
44
42
|
}
|
|
45
|
-
// Feature Flags
|
|
46
43
|
getEnableCompanyFeatureForTenant(tenant) {
|
|
47
44
|
return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
48
45
|
}
|
|
49
46
|
getEnableCompanyFeatureForCurrentTenant() {
|
|
50
47
|
return this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
|
|
51
48
|
}
|
|
52
|
-
// Entity Management
|
|
53
49
|
async getIAMEntities() {
|
|
54
50
|
const { getIAMEntitiesByConfig } = await import('../entities');
|
|
55
51
|
const enableCompanyFeature = this.getEnableCompanyFeatureForCurrentTenant();
|
|
56
52
|
const permissionMode = PermissionModeHelper.toString(this.configService.getPermissionMode());
|
|
57
53
|
return getIAMEntitiesByConfig(enableCompanyFeature, permissionMode);
|
|
58
54
|
}
|
|
59
|
-
// Overrides
|
|
60
55
|
async createDataSourceFromConfig(config) {
|
|
61
56
|
const entities = await this.getIAMEntities();
|
|
62
57
|
return await super.createDataSourceFromConfig(config, entities);
|
|
63
58
|
}
|
|
64
|
-
async getSingleDataSource() {
|
|
65
|
-
if (!IAMDataSourceService.singleDataSource) {
|
|
66
|
-
if (IAMDataSourceService.singleConnectionLock) {
|
|
67
|
-
return IAMDataSourceService.singleConnectionLock;
|
|
68
|
-
}
|
|
69
|
-
const lockPromise = (async ()=>{
|
|
70
|
-
const config = this.getDefaultDatabaseConfig();
|
|
71
|
-
if (!config) {
|
|
72
|
-
throw new InternalServerErrorException({
|
|
73
|
-
message: 'Default database config is not available',
|
|
74
|
-
messageKey: SYSTEM_MESSAGES.DATABASE_CONFIG_NOT_AVAILABLE
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
const ds = await this.createDataSourceFromConfig(config);
|
|
78
|
-
IAMDataSourceService.singleDataSource = ds;
|
|
79
|
-
IAMDataSourceService.initialized = true;
|
|
80
|
-
return ds;
|
|
81
|
-
})();
|
|
82
|
-
IAMDataSourceService.singleConnectionLock = lockPromise;
|
|
83
|
-
try {
|
|
84
|
-
return await lockPromise;
|
|
85
|
-
} finally{
|
|
86
|
-
IAMDataSourceService.singleConnectionLock = null;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return IAMDataSourceService.singleDataSource;
|
|
90
|
-
}
|
|
91
|
-
async getOrCreateTenantConnection(tenant) {
|
|
92
|
-
// Return existing initialized connection from IAM-specific cache
|
|
93
|
-
const existing = IAMDataSourceService.tenantConnections.get(tenant.id);
|
|
94
|
-
if (existing?.isInitialized) {
|
|
95
|
-
return existing;
|
|
96
|
-
}
|
|
97
|
-
// If another request is creating this tenant's connection, wait for it
|
|
98
|
-
const pendingConnection = IAMDataSourceService.connectionLocks.get(tenant.id);
|
|
99
|
-
if (pendingConnection) {
|
|
100
|
-
return pendingConnection;
|
|
101
|
-
}
|
|
102
|
-
// Create connection with lock to prevent race conditions
|
|
103
|
-
const config = this.buildTenantDatabaseConfig(tenant);
|
|
104
|
-
const connectionPromise = this.createDataSourceFromConfig(config);
|
|
105
|
-
IAMDataSourceService.connectionLocks.set(tenant.id, connectionPromise);
|
|
106
|
-
try {
|
|
107
|
-
const dataSource = await connectionPromise;
|
|
108
|
-
IAMDataSourceService.tenantConnections.set(tenant.id, dataSource);
|
|
109
|
-
return dataSource;
|
|
110
|
-
} finally{
|
|
111
|
-
IAMDataSourceService.connectionLocks.delete(tenant.id);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
59
|
constructor(configService, request){
|
|
115
60
|
super(IAMDataSourceService.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), this.configService = configService;
|
|
116
61
|
}
|
|
117
62
|
}
|
|
118
|
-
// Override parent's static properties to have IAM-specific cache
|
|
119
63
|
_define_property(IAMDataSourceService, "tenantConnections", new Map());
|
|
120
64
|
_define_property(IAMDataSourceService, "singleDataSource", null);
|
|
121
65
|
_define_property(IAMDataSourceService, "tenantsRegistry", new Map());
|
|
@@ -25,7 +25,7 @@ function _ts_param(paramIndex, decorator) {
|
|
|
25
25
|
decorator(target, key, paramIndex);
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
-
import { HybridCache,
|
|
28
|
+
import { HybridCache, ApiService } from '@flusys/nestjs-shared/classes';
|
|
29
29
|
import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
30
30
|
import { applyCompanyFilter } from '@flusys/nestjs-shared/utils';
|
|
31
31
|
import { Inject, Injectable, Scope } from '@nestjs/common';
|
|
@@ -33,13 +33,10 @@ import { RoleWithCompany } from '../entities/role-with-company.entity';
|
|
|
33
33
|
import { Role } from '../entities/role.entity';
|
|
34
34
|
import { IAMConfigService } from './iam-config.service';
|
|
35
35
|
import { IAMDataSourceService } from './iam-datasource.service';
|
|
36
|
-
export class RoleService extends
|
|
36
|
+
export class RoleService extends ApiService {
|
|
37
37
|
resolveEntity() {
|
|
38
38
|
return this.iamConfigService.isCompanyFeatureEnabled() ? RoleWithCompany : Role;
|
|
39
39
|
}
|
|
40
|
-
getDataSourceProvider() {
|
|
41
|
-
return this.dataSourceProvider;
|
|
42
|
-
}
|
|
43
40
|
// Entity Conversion
|
|
44
41
|
async convertSingleDtoToEntity(dto, user) {
|
|
45
42
|
const entity = await super.convertSingleDtoToEntity(dto, user);
|
|
@@ -111,7 +108,7 @@ export class RoleService extends RequestScopedApiService {
|
|
|
111
108
|
};
|
|
112
109
|
}
|
|
113
110
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider){
|
|
114
|
-
super('role',
|
|
111
|
+
super('role', cacheManager, utilsService, RoleService.name, true, 'iam', undefined, dataSourceProvider), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService;
|
|
115
112
|
}
|
|
116
113
|
}
|
|
117
114
|
RoleService = _ts_decorate([
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/nestjs-iam",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.3",
|
|
4
4
|
"description": "Identity and Access Management (IAM) module for NestJS applications",
|
|
5
5
|
"main": "cjs/index.js",
|
|
6
6
|
"module": "fesm/index.js",
|
|
@@ -79,18 +79,18 @@
|
|
|
79
79
|
}
|
|
80
80
|
},
|
|
81
81
|
"peerDependencies": {
|
|
82
|
-
"@nestjs/common": "^
|
|
83
|
-
"@nestjs/config": "^
|
|
84
|
-
"@nestjs/core": "^
|
|
85
|
-
"@nestjs/swagger": "^
|
|
86
|
-
"@nestjs/typeorm": "^
|
|
87
|
-
"class-transformer": "^0.5.
|
|
88
|
-
"class-validator": "^0.14.0",
|
|
82
|
+
"@nestjs/common": "^11.0.0",
|
|
83
|
+
"@nestjs/config": "^4.0.0",
|
|
84
|
+
"@nestjs/core": "^11.0.0",
|
|
85
|
+
"@nestjs/swagger": "^11.0.0",
|
|
86
|
+
"@nestjs/typeorm": "^11.0.0",
|
|
87
|
+
"class-transformer": "^0.5.1",
|
|
88
|
+
"class-validator": "^0.14.0 || ^0.15.0",
|
|
89
89
|
"typeorm": "^0.3.0",
|
|
90
|
-
"express": "^4.18.0"
|
|
90
|
+
"express": "^4.18.0 || ^5.0.0"
|
|
91
91
|
},
|
|
92
92
|
"dependencies": {
|
|
93
|
-
"@flusys/nestjs-core": "5.1.
|
|
94
|
-
"@flusys/nestjs-shared": "5.1.
|
|
93
|
+
"@flusys/nestjs-core": "5.1.3",
|
|
94
|
+
"@flusys/nestjs-shared": "5.1.3"
|
|
95
95
|
}
|
|
96
96
|
}
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
import { HybridCache,
|
|
1
|
+
import { HybridCache, ApiService } from '@flusys/nestjs-shared/classes';
|
|
2
2
|
import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
|
|
3
3
|
import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
4
|
-
import {
|
|
4
|
+
import { SelectQueryBuilder } from 'typeorm';
|
|
5
5
|
import { CreateActionDto, UpdateActionDto } from '../dtos/action.dto';
|
|
6
6
|
import { ActionBase } from '../entities/action-base.entity';
|
|
7
7
|
import { IAction, IActionTree } from '../interfaces/action.interface';
|
|
8
8
|
import { IAMConfigService } from './iam-config.service';
|
|
9
9
|
import { IAMDataSourceService } from './iam-datasource.service';
|
|
10
10
|
import { PermissionService } from './permission.service';
|
|
11
|
-
export declare class ActionService extends
|
|
11
|
+
export declare class ActionService extends ApiService<CreateActionDto, UpdateActionDto, IAction, ActionBase> {
|
|
12
12
|
protected cacheManager: HybridCache;
|
|
13
13
|
protected utilsService: UtilsService;
|
|
14
14
|
private readonly iamConfigService;
|
|
15
|
-
private readonly dataSourceProvider;
|
|
16
15
|
private readonly permissionService;
|
|
17
16
|
constructor(cacheManager: HybridCache, utilsService: UtilsService, iamConfigService: IAMConfigService, dataSourceProvider: IAMDataSourceService, permissionService: PermissionService);
|
|
18
|
-
protected resolveEntity(): EntityTarget<ActionBase>;
|
|
19
|
-
protected getDataSourceProvider(): IAMDataSourceService;
|
|
20
17
|
getSelectQuery(query: SelectQueryBuilder<ActionBase>, _user: ILoggedUserInfo | null, select?: string[]): Promise<{
|
|
21
18
|
query: SelectQueryBuilder<ActionBase>;
|
|
22
19
|
isRaw: boolean;
|
|
@@ -17,6 +17,4 @@ export declare class IAMDataSourceService extends MultiTenantDataSourceService {
|
|
|
17
17
|
getEnableCompanyFeatureForCurrentTenant(): boolean;
|
|
18
18
|
getIAMEntities(): Promise<any[]>;
|
|
19
19
|
protected createDataSourceFromConfig(config: IDatabaseConfig): Promise<DataSource>;
|
|
20
|
-
protected getSingleDataSource(): Promise<DataSource>;
|
|
21
|
-
protected getOrCreateTenantConnection(tenant: ITenantDatabaseConfig): Promise<DataSource>;
|
|
22
20
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HybridCache,
|
|
1
|
+
import { HybridCache, ApiService } from '@flusys/nestjs-shared/classes';
|
|
2
2
|
import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
|
|
3
3
|
import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
4
4
|
import { EntityTarget, SelectQueryBuilder } from 'typeorm';
|
|
@@ -7,14 +7,12 @@ import { RoleBase } from '../entities/role-base.entity';
|
|
|
7
7
|
import { IRole } from '../interfaces/role.interface';
|
|
8
8
|
import { IAMConfigService } from './iam-config.service';
|
|
9
9
|
import { IAMDataSourceService } from './iam-datasource.service';
|
|
10
|
-
export declare class RoleService extends
|
|
10
|
+
export declare class RoleService extends ApiService<CreateRoleDto, UpdateRoleDto, IRole, RoleBase> {
|
|
11
11
|
protected cacheManager: HybridCache;
|
|
12
12
|
protected utilsService: UtilsService;
|
|
13
13
|
private readonly iamConfigService;
|
|
14
|
-
private readonly dataSourceProvider;
|
|
15
14
|
constructor(cacheManager: HybridCache, utilsService: UtilsService, iamConfigService: IAMConfigService, dataSourceProvider: IAMDataSourceService);
|
|
16
15
|
protected resolveEntity(): EntityTarget<RoleBase>;
|
|
17
|
-
protected getDataSourceProvider(): IAMDataSourceService;
|
|
18
16
|
convertSingleDtoToEntity(dto: CreateRoleDto | UpdateRoleDto, user: ILoggedUserInfo | null): Promise<RoleBase>;
|
|
19
17
|
getSelectQuery(query: SelectQueryBuilder<RoleBase>, _user: ILoggedUserInfo | null, select?: string[]): Promise<{
|
|
20
18
|
query: SelectQueryBuilder<RoleBase>;
|