@flusys/nestjs-iam 7.0.0 → 7.0.2
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/modules/iam.module.js +0 -3
- package/cjs/modules/iam.module.spec.js +0 -11
- package/cjs/services/action.service.js +1 -1
- package/cjs/services/iam-datasource.service.js +1 -4
- package/cjs/services/iam-datasource.service.spec.js +0 -7
- package/cjs/services/role.service.js +1 -4
- package/cjs/services/role.service.spec.js +9 -6
- package/fesm/modules/iam.module.js +0 -3
- package/fesm/modules/iam.module.spec.js +0 -11
- package/fesm/services/action.service.js +2 -2
- package/fesm/services/iam-datasource.service.js +1 -4
- package/fesm/services/iam-datasource.service.spec.js +0 -7
- package/fesm/services/role.service.js +2 -5
- package/fesm/services/role.service.spec.js +9 -6
- package/interfaces/iam-module-options.interface.d.ts +2 -3
- package/modules/iam.module.d.ts +0 -1
- package/package.json +3 -3
- package/services/iam-datasource.service.d.ts +0 -1
- package/services/role.service.d.ts +1 -2
|
@@ -279,15 +279,4 @@ describe('IAMModule', ()=>{
|
|
|
279
279
|
});
|
|
280
280
|
});
|
|
281
281
|
});
|
|
282
|
-
describe('forFeature', ()=>{
|
|
283
|
-
it('should behave identically to forRoot', ()=>{
|
|
284
|
-
const options = {
|
|
285
|
-
includeController: true,
|
|
286
|
-
bootstrapAppConfig: {
|
|
287
|
-
permissionMode: 'RBAC'
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
expect(_iammodule.IAMModule.forFeature(options)).toEqual(_iammodule.IAMModule.forRoot(options));
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
282
|
});
|
|
@@ -301,7 +301,7 @@ let ActionService = class ActionService extends _classes.ApiService {
|
|
|
301
301
|
return rootNodes;
|
|
302
302
|
}
|
|
303
303
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionService, permissionCacheService){
|
|
304
|
-
super(
|
|
304
|
+
super(_config.IAM_EVENT_ENTITIES.ACTION, cacheManager, utilsService, ActionService.name, true, _config.IAM_EVENT_MODULE, dataSourceProvider, _actionentity.Action), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), _define_property(this, "permissionService", void 0), _define_property(this, "permissionCacheService", void 0), // Custom Methods
|
|
305
305
|
_define_property(this, "actionSelectFields", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionService = permissionService, this.permissionCacheService = permissionCacheService, this.actionSelectFields = [
|
|
306
306
|
'id',
|
|
307
307
|
'code',
|
|
@@ -94,12 +94,9 @@ let IAMDataSourceService = class IAMDataSourceService extends _modules.MultiTena
|
|
|
94
94
|
getEnableCompanyFeatureForTenant(tenant) {
|
|
95
95
|
return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
96
96
|
}
|
|
97
|
-
getEnableCompanyFeatureForCurrentTenant() {
|
|
98
|
-
return this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
|
|
99
|
-
}
|
|
100
97
|
async getIAMEntities() {
|
|
101
98
|
const { getIAMEntitiesByConfig } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")));
|
|
102
|
-
const enableCompanyFeature = this.
|
|
99
|
+
const enableCompanyFeature = this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
|
|
103
100
|
const permissionMode = _helpers.PermissionModeHelper.toString(this.configService.getPermissionMode());
|
|
104
101
|
return getIAMEntitiesByConfig(enableCompanyFeature, permissionMode);
|
|
105
102
|
}
|
|
@@ -50,13 +50,6 @@ describe('IAMDataSourceService', ()=>{
|
|
|
50
50
|
expect(service.getEnableCompanyFeatureForTenant(undefined)).toBe(true);
|
|
51
51
|
});
|
|
52
52
|
});
|
|
53
|
-
describe('getEnableCompanyFeatureForCurrentTenant', ()=>{
|
|
54
|
-
it('falls back to the config service when there is no current request/tenant', ()=>{
|
|
55
|
-
const service = buildService();
|
|
56
|
-
mockConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
|
|
57
|
-
expect(service.getEnableCompanyFeatureForCurrentTenant()).toBe(true);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
53
|
describe('getIAMEntities', ()=>{
|
|
61
54
|
it('returns Action + non-company permission + role entities for RBAC mode', async ()=>{
|
|
62
55
|
mockConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
@@ -129,9 +129,6 @@ let RoleService = class RoleService extends _classes.ApiService {
|
|
|
129
129
|
await this.permissionCacheService.invalidateUsers(affectedUserIds);
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
|
-
resolveEntity() {
|
|
133
|
-
return this.iamConfigService.isCompanyFeatureEnabled() ? _rolewithcompanyentity.RoleWithCompany : _roleentity.Role;
|
|
134
|
-
}
|
|
135
132
|
// Entity Conversion
|
|
136
133
|
async convertSingleDtoToEntity(dto, user) {
|
|
137
134
|
const entity = await super.convertSingleDtoToEntity(dto, user);
|
|
@@ -204,7 +201,7 @@ let RoleService = class RoleService extends _classes.ApiService {
|
|
|
204
201
|
};
|
|
205
202
|
}
|
|
206
203
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionCacheService){
|
|
207
|
-
super(
|
|
204
|
+
super(_config.IAM_EVENT_ENTITIES.ROLE, cacheManager, utilsService, RoleService.name, true, _config.IAM_EVENT_MODULE, dataSourceProvider, iamConfigService.isCompanyFeatureEnabled() ? _rolewithcompanyentity.RoleWithCompany : _roleentity.Role), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), _define_property(this, "permissionCacheService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionCacheService = permissionCacheService;
|
|
208
205
|
}
|
|
209
206
|
};
|
|
210
207
|
RoleService = _ts_decorate([
|
|
@@ -31,6 +31,7 @@ function buildRole(overrides = {}) {
|
|
|
31
31
|
}
|
|
32
32
|
describe('RoleService', ()=>{
|
|
33
33
|
let service;
|
|
34
|
+
let module;
|
|
34
35
|
let mockRepo;
|
|
35
36
|
let mockIamConfigService;
|
|
36
37
|
let mockPermissionCacheService;
|
|
@@ -44,7 +45,7 @@ describe('RoleService', ()=>{
|
|
|
44
45
|
mockPermissionCacheService = {
|
|
45
46
|
invalidateUsers: jest.fn()
|
|
46
47
|
};
|
|
47
|
-
|
|
48
|
+
module = await _testing.Test.createTestingModule({
|
|
48
49
|
providers: [
|
|
49
50
|
_roleservice.RoleService,
|
|
50
51
|
{
|
|
@@ -71,14 +72,16 @@ describe('RoleService', ()=>{
|
|
|
71
72
|
}).compile();
|
|
72
73
|
service = await module.resolve(_roleservice.RoleService);
|
|
73
74
|
});
|
|
74
|
-
describe('
|
|
75
|
-
it('
|
|
75
|
+
describe('entity selection', ()=>{
|
|
76
|
+
it('uses Role when the company feature is disabled', async ()=>{
|
|
76
77
|
mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
77
|
-
|
|
78
|
+
const built = await module.resolve(_roleservice.RoleService);
|
|
79
|
+
expect(built['_entity']).toBe(_roleentity.Role);
|
|
78
80
|
});
|
|
79
|
-
it('
|
|
81
|
+
it('uses RoleWithCompany when the company feature is enabled', async ()=>{
|
|
80
82
|
mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
|
|
81
|
-
|
|
83
|
+
const built = await module.resolve(_roleservice.RoleService);
|
|
84
|
+
expect(built['_entity']).toBe(_rolewithcompanyentity.RoleWithCompany);
|
|
82
85
|
});
|
|
83
86
|
});
|
|
84
87
|
describe('convertSingleDtoToEntity', ()=>{
|
|
@@ -275,15 +275,4 @@ describe('IAMModule', ()=>{
|
|
|
275
275
|
});
|
|
276
276
|
});
|
|
277
277
|
});
|
|
278
|
-
describe('forFeature', ()=>{
|
|
279
|
-
it('should behave identically to forRoot', ()=>{
|
|
280
|
-
const options = {
|
|
281
|
-
includeController: true,
|
|
282
|
-
bootstrapAppConfig: {
|
|
283
|
-
permissionMode: 'RBAC'
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
expect(IAMModule.forFeature(options)).toEqual(IAMModule.forRoot(options));
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
278
|
});
|
|
@@ -29,7 +29,7 @@ import { ApiService, HybridCache } from '@flusys/nestjs-shared/classes';
|
|
|
29
29
|
import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
30
30
|
import { BadRequestException, ForbiddenException, Inject, Injectable, Scope } from '@nestjs/common';
|
|
31
31
|
import { In, IsNull } from 'typeorm';
|
|
32
|
-
import { ACTION_MESSAGES, PERMISSION_OPERATION_MESSAGES } from '../config';
|
|
32
|
+
import { ACTION_MESSAGES, IAM_EVENT_ENTITIES, IAM_EVENT_MODULE, PERMISSION_OPERATION_MESSAGES } from '../config';
|
|
33
33
|
import { Action } from '../entities/action.entity';
|
|
34
34
|
import { UserIamPermissionWithCompany } from '../entities/permission-with-company.entity';
|
|
35
35
|
import { UserIamPermission } from '../entities/user-iam-permission.entity';
|
|
@@ -291,7 +291,7 @@ export class ActionService extends ApiService {
|
|
|
291
291
|
return rootNodes;
|
|
292
292
|
}
|
|
293
293
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionService, permissionCacheService){
|
|
294
|
-
super(
|
|
294
|
+
super(IAM_EVENT_ENTITIES.ACTION, cacheManager, utilsService, ActionService.name, true, IAM_EVENT_MODULE, dataSourceProvider, Action), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), _define_property(this, "permissionService", void 0), _define_property(this, "permissionCacheService", void 0), // Custom Methods
|
|
295
295
|
_define_property(this, "actionSelectFields", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionService = permissionService, this.permissionCacheService = permissionCacheService, this.actionSelectFields = [
|
|
296
296
|
'id',
|
|
297
297
|
'code',
|
|
@@ -43,12 +43,9 @@ export class IAMDataSourceService extends MultiTenantDataSourceService {
|
|
|
43
43
|
getEnableCompanyFeatureForTenant(tenant) {
|
|
44
44
|
return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
45
45
|
}
|
|
46
|
-
getEnableCompanyFeatureForCurrentTenant() {
|
|
47
|
-
return this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
|
|
48
|
-
}
|
|
49
46
|
async getIAMEntities() {
|
|
50
47
|
const { getIAMEntitiesByConfig } = await import('../entities');
|
|
51
|
-
const enableCompanyFeature = this.
|
|
48
|
+
const enableCompanyFeature = this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
|
|
52
49
|
const permissionMode = PermissionModeHelper.toString(this.configService.getPermissionMode());
|
|
53
50
|
return getIAMEntitiesByConfig(enableCompanyFeature, permissionMode);
|
|
54
51
|
}
|
|
@@ -46,13 +46,6 @@ describe('IAMDataSourceService', ()=>{
|
|
|
46
46
|
expect(service.getEnableCompanyFeatureForTenant(undefined)).toBe(true);
|
|
47
47
|
});
|
|
48
48
|
});
|
|
49
|
-
describe('getEnableCompanyFeatureForCurrentTenant', ()=>{
|
|
50
|
-
it('falls back to the config service when there is no current request/tenant', ()=>{
|
|
51
|
-
const service = buildService();
|
|
52
|
-
mockConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
|
|
53
|
-
expect(service.getEnableCompanyFeatureForCurrentTenant()).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
49
|
describe('getIAMEntities', ()=>{
|
|
57
50
|
it('returns Action + non-company permission + role entities for RBAC mode', async ()=>{
|
|
58
51
|
mockConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
@@ -30,7 +30,7 @@ import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
|
30
30
|
import { applyCompanyFilter } from '@flusys/nestjs-shared/utils';
|
|
31
31
|
import { ForbiddenException, Inject, Injectable, Scope } from '@nestjs/common';
|
|
32
32
|
import { In, IsNull } from 'typeorm';
|
|
33
|
-
import { ROLE_MESSAGES } from '../config';
|
|
33
|
+
import { IAM_EVENT_ENTITIES, IAM_EVENT_MODULE, ROLE_MESSAGES } from '../config';
|
|
34
34
|
import { UserIamPermissionWithCompany } from '../entities/permission-with-company.entity';
|
|
35
35
|
import { RoleWithCompany } from '../entities/role-with-company.entity';
|
|
36
36
|
import { Role } from '../entities/role.entity';
|
|
@@ -119,9 +119,6 @@ export class RoleService extends ApiService {
|
|
|
119
119
|
await this.permissionCacheService.invalidateUsers(affectedUserIds);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
resolveEntity() {
|
|
123
|
-
return this.iamConfigService.isCompanyFeatureEnabled() ? RoleWithCompany : Role;
|
|
124
|
-
}
|
|
125
122
|
// Entity Conversion
|
|
126
123
|
async convertSingleDtoToEntity(dto, user) {
|
|
127
124
|
const entity = await super.convertSingleDtoToEntity(dto, user);
|
|
@@ -194,7 +191,7 @@ export class RoleService extends ApiService {
|
|
|
194
191
|
};
|
|
195
192
|
}
|
|
196
193
|
constructor(cacheManager, utilsService, iamConfigService, dataSourceProvider, permissionCacheService){
|
|
197
|
-
super(
|
|
194
|
+
super(IAM_EVENT_ENTITIES.ROLE, cacheManager, utilsService, RoleService.name, true, IAM_EVENT_MODULE, dataSourceProvider, iamConfigService.isCompanyFeatureEnabled() ? RoleWithCompany : Role), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "iamConfigService", void 0), _define_property(this, "permissionCacheService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionCacheService = permissionCacheService;
|
|
198
195
|
}
|
|
199
196
|
}
|
|
200
197
|
RoleService = _ts_decorate([
|
|
@@ -27,6 +27,7 @@ function buildRole(overrides = {}) {
|
|
|
27
27
|
}
|
|
28
28
|
describe('RoleService', ()=>{
|
|
29
29
|
let service;
|
|
30
|
+
let module;
|
|
30
31
|
let mockRepo;
|
|
31
32
|
let mockIamConfigService;
|
|
32
33
|
let mockPermissionCacheService;
|
|
@@ -40,7 +41,7 @@ describe('RoleService', ()=>{
|
|
|
40
41
|
mockPermissionCacheService = {
|
|
41
42
|
invalidateUsers: jest.fn()
|
|
42
43
|
};
|
|
43
|
-
|
|
44
|
+
module = await Test.createTestingModule({
|
|
44
45
|
providers: [
|
|
45
46
|
RoleService,
|
|
46
47
|
{
|
|
@@ -67,14 +68,16 @@ describe('RoleService', ()=>{
|
|
|
67
68
|
}).compile();
|
|
68
69
|
service = await module.resolve(RoleService);
|
|
69
70
|
});
|
|
70
|
-
describe('
|
|
71
|
-
it('
|
|
71
|
+
describe('entity selection', ()=>{
|
|
72
|
+
it('uses Role when the company feature is disabled', async ()=>{
|
|
72
73
|
mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
73
|
-
|
|
74
|
+
const built = await module.resolve(RoleService);
|
|
75
|
+
expect(built['_entity']).toBe(Role);
|
|
74
76
|
});
|
|
75
|
-
it('
|
|
77
|
+
it('uses RoleWithCompany when the company feature is enabled', async ()=>{
|
|
76
78
|
mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
|
|
77
|
-
|
|
79
|
+
const built = await module.resolve(RoleService);
|
|
80
|
+
expect(built['_entity']).toBe(RoleWithCompany);
|
|
78
81
|
});
|
|
79
82
|
});
|
|
80
83
|
describe('convertSingleDtoToEntity', ()=>{
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IBootstrapAppConfig, IDataSourceServiceOptions, IDynamicModuleConfig
|
|
1
|
+
import { IBootstrapAppConfig, IDataSourceServiceOptions, IDynamicModuleConfig } from '@flusys/nestjs-core';
|
|
2
2
|
import { IModuleEventsConfig } from '@flusys/nestjs-shared/interfaces';
|
|
3
3
|
import { ModuleMetadata, Type } from '@nestjs/common';
|
|
4
4
|
export interface IIAMModuleConfig extends IDataSourceServiceOptions {
|
|
@@ -8,9 +8,8 @@ export interface IAMModuleOptions extends IDynamicModuleConfig {
|
|
|
8
8
|
bootstrapAppConfig?: IBootstrapAppConfig;
|
|
9
9
|
config?: IIAMModuleConfig;
|
|
10
10
|
}
|
|
11
|
-
export interface IAMOptionsFactory
|
|
11
|
+
export interface IAMOptionsFactory {
|
|
12
12
|
createIAMOptions(): Promise<IIAMModuleConfig> | IIAMModuleConfig;
|
|
13
|
-
createOptions(): Promise<IIAMModuleConfig> | IIAMModuleConfig;
|
|
14
13
|
}
|
|
15
14
|
export interface IAMModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'>, IDynamicModuleConfig {
|
|
16
15
|
bootstrapAppConfig?: IBootstrapAppConfig;
|
package/modules/iam.module.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/nestjs-iam",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.2",
|
|
4
4
|
"description": "Identity and Access Management (IAM) module for NestJS applications",
|
|
5
5
|
"main": "cjs/index.js",
|
|
6
6
|
"module": "fesm/index.js",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"express": "^5.0.0"
|
|
91
91
|
},
|
|
92
92
|
"dependencies": {
|
|
93
|
-
"@flusys/nestjs-core": "7.0.
|
|
94
|
-
"@flusys/nestjs-shared": "7.0.
|
|
93
|
+
"@flusys/nestjs-core": "7.0.2",
|
|
94
|
+
"@flusys/nestjs-shared": "7.0.2"
|
|
95
95
|
}
|
|
96
96
|
}
|
|
@@ -14,7 +14,6 @@ export declare class IAMDataSourceService extends MultiTenantDataSourceService {
|
|
|
14
14
|
constructor(configService: IAMConfigService, request?: Request);
|
|
15
15
|
private static buildParentOptions;
|
|
16
16
|
getEnableCompanyFeatureForTenant(tenant?: ITenantDatabaseConfig): boolean;
|
|
17
|
-
getEnableCompanyFeatureForCurrentTenant(): boolean;
|
|
18
17
|
getIAMEntities(): Promise<any[]>;
|
|
19
18
|
protected createDataSourceFromConfig(config: IDatabaseConfig): Promise<DataSource>;
|
|
20
19
|
}
|
|
@@ -2,7 +2,7 @@ import { ApiService, HybridCache } from '@flusys/nestjs-shared/classes';
|
|
|
2
2
|
import { DeleteDto } from '@flusys/nestjs-shared/dtos';
|
|
3
3
|
import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
|
|
4
4
|
import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
5
|
-
import {
|
|
5
|
+
import { QueryRunner, SelectQueryBuilder } from 'typeorm';
|
|
6
6
|
import { CreateRoleDto, UpdateRoleDto } from '../dtos/role.dto';
|
|
7
7
|
import { RoleBase } from '../entities/role-base.entity';
|
|
8
8
|
import { IRole } from '../interfaces/role.interface';
|
|
@@ -17,7 +17,6 @@ export declare class RoleService extends ApiService<CreateRoleDto, UpdateRoleDto
|
|
|
17
17
|
constructor(cacheManager: HybridCache, utilsService: UtilsService, iamConfigService: IAMConfigService, dataSourceProvider: IAMDataSourceService, permissionCacheService: PermissionCacheService);
|
|
18
18
|
protected beforeUpdateOperation(dto: UpdateRoleDto | UpdateRoleDto[], _user: ILoggedUserInfo | null, _queryRunner: QueryRunner): Promise<void>;
|
|
19
19
|
protected beforeDeleteOperation(dto: DeleteDto, user: ILoggedUserInfo | null, queryRunner: QueryRunner): Promise<void>;
|
|
20
|
-
protected resolveEntity(): EntityTarget<RoleBase>;
|
|
21
20
|
convertSingleDtoToEntity(dto: CreateRoleDto | UpdateRoleDto, user: ILoggedUserInfo | null): Promise<RoleBase>;
|
|
22
21
|
getSelectQuery(query: SelectQueryBuilder<RoleBase>, _user: ILoggedUserInfo | null, select?: string[]): Promise<{
|
|
23
22
|
query: SelectQueryBuilder<RoleBase>;
|