@flusys/nestjs-iam 7.0.0-beta.1 → 7.0.1

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.
@@ -180,9 +180,6 @@ let IAMModule = class IAMModule {
180
180
  inject
181
181
  };
182
182
  }
183
- static forFeature(options = {}) {
184
- return this.forRoot(options);
185
- }
186
183
  };
187
184
  IAMModule = _ts_decorate([
188
185
  (0, _common.Module)({})
@@ -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('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), _define_property(this, "permissionCacheService", void 0), // Custom Methods
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.getEnableCompanyFeatureForCurrentTenant();
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('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), _define_property(this, "permissionCacheService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionCacheService = permissionCacheService;
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
- const module = await _testing.Test.createTestingModule({
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('resolveEntity', ()=>{
75
- it('resolves to Role when the company feature is disabled', ()=>{
75
+ describe('entity selection', ()=>{
76
+ it('uses Role when the company feature is disabled', async ()=>{
76
77
  mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
77
- expect(service.resolveEntity()).toBe(_roleentity.Role);
78
+ const built = await module.resolve(_roleservice.RoleService);
79
+ expect(built['_entity']).toBe(_roleentity.Role);
78
80
  });
79
- it('resolves to RoleWithCompany when the company feature is enabled', ()=>{
81
+ it('uses RoleWithCompany when the company feature is enabled', async ()=>{
80
82
  mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
81
- expect(service.resolveEntity()).toBe(_rolewithcompanyentity.RoleWithCompany);
83
+ const built = await module.resolve(_roleservice.RoleService);
84
+ expect(built['_entity']).toBe(_rolewithcompanyentity.RoleWithCompany);
82
85
  });
83
86
  });
84
87
  describe('convertSingleDtoToEntity', ()=>{
@@ -170,9 +170,6 @@ export class IAMModule {
170
170
  inject
171
171
  };
172
172
  }
173
- static forFeature(options = {}) {
174
- return this.forRoot(options);
175
- }
176
173
  }
177
174
  IAMModule = _ts_decorate([
178
175
  Module({})
@@ -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('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), _define_property(this, "permissionCacheService", void 0), // Custom Methods
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.getEnableCompanyFeatureForCurrentTenant();
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('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), _define_property(this, "permissionCacheService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.iamConfigService = iamConfigService, this.permissionCacheService = permissionCacheService;
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
- const module = await Test.createTestingModule({
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('resolveEntity', ()=>{
71
- it('resolves to Role when the company feature is disabled', ()=>{
71
+ describe('entity selection', ()=>{
72
+ it('uses Role when the company feature is disabled', async ()=>{
72
73
  mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
73
- expect(service.resolveEntity()).toBe(Role);
74
+ const built = await module.resolve(RoleService);
75
+ expect(built['_entity']).toBe(Role);
74
76
  });
75
- it('resolves to RoleWithCompany when the company feature is enabled', ()=>{
77
+ it('uses RoleWithCompany when the company feature is enabled', async ()=>{
76
78
  mockIamConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
77
- expect(service.resolveEntity()).toBe(RoleWithCompany);
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, IModuleOptionsFactory } from '@flusys/nestjs-core';
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 extends IModuleOptionsFactory<IIAMModuleConfig> {
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;
@@ -9,5 +9,4 @@ export declare class IAMModule {
9
9
  static forRootAsync(asyncOptions: IAMModuleAsyncOptions): DynamicModule;
10
10
  private static createAsyncProviders;
11
11
  private static createAsyncOptionsProvider;
12
- static forFeature(options?: IAMModuleOptions): DynamicModule;
13
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flusys/nestjs-iam",
3
- "version": "7.0.0-beta.1",
3
+ "version": "7.0.1",
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.0-beta.1",
94
- "@flusys/nestjs-shared": "7.0.0-beta.1"
93
+ "@flusys/nestjs-core": "7.0.1",
94
+ "@flusys/nestjs-shared": "7.0.1"
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 { EntityTarget, QueryRunner, SelectQueryBuilder } from 'typeorm';
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>;