@flusys/nestjs-iam 7.0.2 → 8.0.0-beta.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.
Files changed (173) hide show
  1. package/config/index.d.ts +3 -3
  2. package/controllers/action.controller.d.ts +4 -4
  3. package/controllers/company-action-permission.controller.d.ts +2 -2
  4. package/controllers/index.d.ts +6 -6
  5. package/controllers/my-permission.controller.d.ts +3 -3
  6. package/controllers/role-permission.controller.d.ts +4 -4
  7. package/controllers/role.controller.d.ts +2 -2
  8. package/controllers/user-action-permission.controller.d.ts +4 -4
  9. package/docs/iam-swagger.config.d.ts +2 -2
  10. package/docs/index.d.ts +1 -1
  11. package/dtos/action.dto.d.ts +2 -2
  12. package/dtos/index.d.ts +3 -3
  13. package/entities/action.entity.d.ts +2 -2
  14. package/entities/index.d.ts +11 -11
  15. package/entities/permission-with-company.entity.d.ts +1 -1
  16. package/entities/role-with-company.entity.d.ts +1 -1
  17. package/entities/role.entity.d.ts +1 -1
  18. package/entities/user-iam-permission.entity.d.ts +1 -1
  19. package/enums/index.d.ts +4 -4
  20. package/fesm/284.js +1262 -0
  21. package/fesm/867.js +3699 -0
  22. package/fesm/chunks/364.js +86 -0
  23. package/fesm/config/index.js +133 -3
  24. package/fesm/controllers/index.js +18 -7
  25. package/fesm/docs/index.js +240 -1
  26. package/fesm/dtos/index.js +1090 -3
  27. package/fesm/entities/index.js +670 -31
  28. package/fesm/enums/index.js +97 -4
  29. package/fesm/helpers/index.js +125 -2
  30. package/fesm/index.js +806 -11
  31. package/fesm/interfaces/index.js +17 -3
  32. package/fesm/modules/index.js +259 -1
  33. package/fesm/runtime.js +134 -0
  34. package/fesm/services/index.js +43 -6
  35. package/fesm/types/index.js +15 -1
  36. package/helpers/company-access.helper.d.ts +2 -2
  37. package/helpers/index.d.ts +2 -2
  38. package/helpers/permission-mode.helper.d.ts +1 -1
  39. package/index.d.ts +11 -11
  40. package/interfaces/action.interface.d.ts +2 -2
  41. package/interfaces/iam-module-options.interface.d.ts +3 -3
  42. package/interfaces/index.d.ts +3 -3
  43. package/modules/iam.module.d.ts +2 -2
  44. package/modules/index.d.ts +1 -1
  45. package/package.json +30 -37
  46. package/services/action.service.d.ts +9 -9
  47. package/services/iam-config.service.d.ts +4 -4
  48. package/services/iam-datasource.service.d.ts +3 -3
  49. package/services/index.d.ts +6 -6
  50. package/services/permission-cache.service.d.ts +5 -5
  51. package/services/permission.service.d.ts +4 -4
  52. package/services/role.service.d.ts +8 -8
  53. package/types/index.d.ts +1 -1
  54. package/cjs/config/event-actions.js +0 -36
  55. package/cjs/config/iam.constants.js +0 -11
  56. package/cjs/config/index.js +0 -20
  57. package/cjs/config/message-keys.js +0 -71
  58. package/cjs/controllers/action.controller.js +0 -174
  59. package/cjs/controllers/action.controller.spec.js +0 -79
  60. package/cjs/controllers/company-action-permission.controller.js +0 -119
  61. package/cjs/controllers/company-action-permission.controller.spec.js +0 -65
  62. package/cjs/controllers/index.js +0 -23
  63. package/cjs/controllers/my-permission.controller.js +0 -147
  64. package/cjs/controllers/my-permission.controller.spec.js +0 -128
  65. package/cjs/controllers/role-permission.controller.js +0 -191
  66. package/cjs/controllers/role-permission.controller.spec.js +0 -140
  67. package/cjs/controllers/role.controller.js +0 -102
  68. package/cjs/controllers/role.controller.spec.js +0 -86
  69. package/cjs/controllers/user-action-permission.controller.js +0 -129
  70. package/cjs/controllers/user-action-permission.controller.spec.js +0 -68
  71. package/cjs/docs/iam-swagger.config.js +0 -209
  72. package/cjs/docs/iam-swagger.config.spec.js +0 -99
  73. package/cjs/docs/index.js +0 -18
  74. package/cjs/dtos/action.dto.js +0 -282
  75. package/cjs/dtos/index.js +0 -21
  76. package/cjs/dtos/permission.dto.js +0 -637
  77. package/cjs/dtos/role.dto.js +0 -155
  78. package/cjs/entities/action.entity.js +0 -138
  79. package/cjs/entities/index.js +0 -80
  80. package/cjs/entities/index.spec.js +0 -56
  81. package/cjs/entities/permission-base.entity.js +0 -107
  82. package/cjs/entities/permission-with-company.entity.js +0 -100
  83. package/cjs/entities/role-base.entity.js +0 -80
  84. package/cjs/entities/role-with-company.entity.js +0 -55
  85. package/cjs/entities/role.entity.js +0 -25
  86. package/cjs/entities/user-iam-permission.entity.js +0 -43
  87. package/cjs/enums/action-type.enum.js +0 -22
  88. package/cjs/enums/iam-entity-type.enum.js +0 -17
  89. package/cjs/enums/iam-permission-type.enum.js +0 -17
  90. package/cjs/enums/index.js +0 -21
  91. package/cjs/enums/permission-type.enum.js +0 -16
  92. package/cjs/helpers/company-access.helper.js +0 -23
  93. package/cjs/helpers/company-access.helper.spec.js +0 -68
  94. package/cjs/helpers/index.js +0 -19
  95. package/cjs/helpers/permission-mode.helper.js +0 -49
  96. package/cjs/helpers/permission-mode.helper.spec.js +0 -54
  97. package/cjs/index.js +0 -28
  98. package/cjs/interfaces/action.interface.js +0 -4
  99. package/cjs/interfaces/iam-module-options.interface.js +0 -4
  100. package/cjs/interfaces/index.js +0 -20
  101. package/cjs/interfaces/role.interface.js +0 -7
  102. package/cjs/modules/iam.module.js +0 -186
  103. package/cjs/modules/iam.module.spec.js +0 -282
  104. package/cjs/modules/index.js +0 -18
  105. package/cjs/services/action.service.js +0 -337
  106. package/cjs/services/action.service.spec.js +0 -351
  107. package/cjs/services/iam-config.service.js +0 -87
  108. package/cjs/services/iam-config.service.spec.js +0 -110
  109. package/cjs/services/iam-datasource.service.js +0 -129
  110. package/cjs/services/iam-datasource.service.spec.js +0 -110
  111. package/cjs/services/index.js +0 -23
  112. package/cjs/services/permission-cache.service.js +0 -544
  113. package/cjs/services/permission-cache.service.spec.js +0 -718
  114. package/cjs/services/permission.service.js +0 -914
  115. package/cjs/services/permission.service.spec.js +0 -918
  116. package/cjs/services/role.service.js +0 -224
  117. package/cjs/services/role.service.spec.js +0 -347
  118. package/cjs/types/index.js +0 -18
  119. package/cjs/types/logic-node.type.js +0 -30
  120. package/fesm/config/event-actions.js +0 -15
  121. package/fesm/config/iam.constants.js +0 -1
  122. package/fesm/config/message-keys.js +0 -35
  123. package/fesm/controllers/action.controller.js +0 -164
  124. package/fesm/controllers/action.controller.spec.js +0 -75
  125. package/fesm/controllers/company-action-permission.controller.js +0 -109
  126. package/fesm/controllers/company-action-permission.controller.spec.js +0 -61
  127. package/fesm/controllers/my-permission.controller.js +0 -137
  128. package/fesm/controllers/my-permission.controller.spec.js +0 -124
  129. package/fesm/controllers/role-permission.controller.js +0 -181
  130. package/fesm/controllers/role-permission.controller.spec.js +0 -136
  131. package/fesm/controllers/role.controller.js +0 -92
  132. package/fesm/controllers/role.controller.spec.js +0 -82
  133. package/fesm/controllers/user-action-permission.controller.js +0 -119
  134. package/fesm/controllers/user-action-permission.controller.spec.js +0 -64
  135. package/fesm/docs/iam-swagger.config.js +0 -199
  136. package/fesm/docs/iam-swagger.config.spec.js +0 -95
  137. package/fesm/dtos/action.dto.js +0 -252
  138. package/fesm/dtos/permission.dto.js +0 -571
  139. package/fesm/dtos/role.dto.js +0 -134
  140. package/fesm/entities/action.entity.js +0 -128
  141. package/fesm/entities/index.spec.js +0 -52
  142. package/fesm/entities/permission-base.entity.js +0 -100
  143. package/fesm/entities/permission-with-company.entity.js +0 -90
  144. package/fesm/entities/role-base.entity.js +0 -70
  145. package/fesm/entities/role-with-company.entity.js +0 -45
  146. package/fesm/entities/role.entity.js +0 -15
  147. package/fesm/entities/user-iam-permission.entity.js +0 -33
  148. package/fesm/enums/action-type.enum.js +0 -12
  149. package/fesm/enums/iam-entity-type.enum.js +0 -7
  150. package/fesm/enums/iam-permission-type.enum.js +0 -7
  151. package/fesm/enums/permission-type.enum.js +0 -6
  152. package/fesm/helpers/company-access.helper.js +0 -18
  153. package/fesm/helpers/company-access.helper.spec.js +0 -64
  154. package/fesm/helpers/permission-mode.helper.js +0 -49
  155. package/fesm/helpers/permission-mode.helper.spec.js +0 -50
  156. package/fesm/interfaces/action.interface.js +0 -3
  157. package/fesm/interfaces/iam-module-options.interface.js +0 -3
  158. package/fesm/interfaces/role.interface.js +0 -4
  159. package/fesm/modules/iam.module.js +0 -176
  160. package/fesm/modules/iam.module.spec.js +0 -278
  161. package/fesm/services/action.service.js +0 -327
  162. package/fesm/services/action.service.spec.js +0 -347
  163. package/fesm/services/iam-config.service.js +0 -77
  164. package/fesm/services/iam-config.service.spec.js +0 -106
  165. package/fesm/services/iam-datasource.service.js +0 -78
  166. package/fesm/services/iam-datasource.service.spec.js +0 -106
  167. package/fesm/services/permission-cache.service.js +0 -527
  168. package/fesm/services/permission-cache.service.spec.js +0 -714
  169. package/fesm/services/permission.service.js +0 -904
  170. package/fesm/services/permission.service.spec.js +0 -914
  171. package/fesm/services/role.service.js +0 -214
  172. package/fesm/services/role.service.spec.js +0 -343
  173. package/fesm/types/logic-node.type.js +0 -27
@@ -1,77 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- function _ts_param(paramIndex, decorator) {
24
- return function(target, key) {
25
- decorator(target, key, paramIndex);
26
- };
27
- }
28
- import { Inject, Injectable, Optional } from '@nestjs/common';
29
- import { IAM_MODULE_OPTIONS } from '../config/iam.constants';
30
- import { IAMPermissionMode } from '../enums/permission-type.enum';
31
- import { PermissionModeHelper } from '../helpers';
32
- import { IAMModuleOptions } from '../interfaces/iam-module-options.interface';
33
- export class IAMConfigService {
34
- // Database Mode
35
- getDatabaseMode() {
36
- return this.options.bootstrapAppConfig?.databaseMode ?? 'single';
37
- }
38
- isMultiTenant() {
39
- return this.getDatabaseMode() === 'multi-tenant';
40
- }
41
- // Feature Flags
42
- isCompanyFeatureEnabled() {
43
- return this.options.bootstrapAppConfig?.enableCompanyFeature ?? false;
44
- }
45
- // Permission Mode
46
- getPermissionMode() {
47
- return PermissionModeHelper.fromString(this.options.bootstrapAppConfig?.permissionMode);
48
- }
49
- isRbacEnabled() {
50
- const mode = this.getPermissionMode();
51
- return mode === IAMPermissionMode.RBAC || mode === IAMPermissionMode.FULL;
52
- }
53
- isDirectPermissionEnabled() {
54
- const mode = this.getPermissionMode();
55
- return mode === IAMPermissionMode.DIRECT || mode === IAMPermissionMode.FULL;
56
- }
57
- // Options
58
- getOptions() {
59
- return this.options;
60
- }
61
- constructor(injectedOptions){
62
- _define_property(this, "options", void 0);
63
- this.options = injectedOptions ?? {
64
- global: false,
65
- includeController: false
66
- };
67
- }
68
- }
69
- IAMConfigService = _ts_decorate([
70
- Injectable(),
71
- _ts_param(0, Optional()),
72
- _ts_param(0, Inject(IAM_MODULE_OPTIONS)),
73
- _ts_metadata("design:type", Function),
74
- _ts_metadata("design:paramtypes", [
75
- typeof IAMModuleOptions === "undefined" ? Object : IAMModuleOptions
76
- ])
77
- ], IAMConfigService);
@@ -1,106 +0,0 @@
1
- import { IAMPermissionMode } from '../enums/permission-type.enum';
2
- import { IAMConfigService } from './iam-config.service';
3
- describe('IAMConfigService', ()=>{
4
- describe('with no injected options (defaults)', ()=>{
5
- let service;
6
- beforeEach(()=>{
7
- service = new IAMConfigService();
8
- });
9
- it('defaults to single database mode', ()=>{
10
- expect(service.getDatabaseMode()).toBe('single');
11
- expect(service.isMultiTenant()).toBe(false);
12
- });
13
- it('defaults company feature to disabled', ()=>{
14
- expect(service.isCompanyFeatureEnabled()).toBe(false);
15
- });
16
- it('defaults permission mode to FULL', ()=>{
17
- expect(service.getPermissionMode()).toBe(IAMPermissionMode.FULL);
18
- expect(service.isRbacEnabled()).toBe(true);
19
- expect(service.isDirectPermissionEnabled()).toBe(true);
20
- });
21
- it('returns the fallback options object from getOptions', ()=>{
22
- expect(service.getOptions()).toEqual({
23
- global: false,
24
- includeController: false
25
- });
26
- });
27
- });
28
- describe('with injected options', ()=>{
29
- function buildService(overrides) {
30
- const options = {
31
- global: false,
32
- includeController: false,
33
- bootstrapAppConfig: {
34
- databaseMode: 'single',
35
- enableCompanyFeature: false,
36
- ...overrides
37
- }
38
- };
39
- return new IAMConfigService(options);
40
- }
41
- it('reports multi-tenant mode when configured', ()=>{
42
- const service = buildService({
43
- databaseMode: 'multi-tenant'
44
- });
45
- expect(service.getDatabaseMode()).toBe('multi-tenant');
46
- expect(service.isMultiTenant()).toBe(true);
47
- });
48
- it('reports company feature enabled when configured', ()=>{
49
- const service = buildService({
50
- enableCompanyFeature: true
51
- });
52
- expect(service.isCompanyFeatureEnabled()).toBe(true);
53
- });
54
- describe('permission mode: RBAC', ()=>{
55
- let service;
56
- beforeEach(()=>{
57
- service = buildService({
58
- permissionMode: 'RBAC'
59
- });
60
- });
61
- it('enables RBAC but not direct permissions', ()=>{
62
- expect(service.getPermissionMode()).toBe(IAMPermissionMode.RBAC);
63
- expect(service.isRbacEnabled()).toBe(true);
64
- expect(service.isDirectPermissionEnabled()).toBe(false);
65
- });
66
- });
67
- describe('permission mode: DIRECT', ()=>{
68
- let service;
69
- beforeEach(()=>{
70
- service = buildService({
71
- permissionMode: 'DIRECT'
72
- });
73
- });
74
- it('enables direct permissions but not RBAC', ()=>{
75
- expect(service.getPermissionMode()).toBe(IAMPermissionMode.DIRECT);
76
- expect(service.isRbacEnabled()).toBe(false);
77
- expect(service.isDirectPermissionEnabled()).toBe(true);
78
- });
79
- });
80
- describe('permission mode: FULL', ()=>{
81
- let service;
82
- beforeEach(()=>{
83
- service = buildService({
84
- permissionMode: 'FULL'
85
- });
86
- });
87
- it('enables both RBAC and direct permissions', ()=>{
88
- expect(service.getPermissionMode()).toBe(IAMPermissionMode.FULL);
89
- expect(service.isRbacEnabled()).toBe(true);
90
- expect(service.isDirectPermissionEnabled()).toBe(true);
91
- });
92
- });
93
- it('returns the exact injected options object from getOptions', ()=>{
94
- const options = {
95
- global: true,
96
- includeController: true,
97
- bootstrapAppConfig: {
98
- databaseMode: 'single',
99
- enableCompanyFeature: true
100
- }
101
- };
102
- const service = new IAMConfigService(options);
103
- expect(service.getOptions()).toBe(options);
104
- });
105
- });
106
- });
@@ -1,78 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- function _ts_param(paramIndex, decorator) {
24
- return function(target, key) {
25
- decorator(target, key, paramIndex);
26
- };
27
- }
28
- import { MultiTenantDataSourceService } from '@flusys/nestjs-shared/modules';
29
- import { Inject, Injectable, Optional, Scope } from '@nestjs/common';
30
- import { REQUEST } from '@nestjs/core';
31
- import { Request } from 'express';
32
- import { PermissionModeHelper } from '../helpers';
33
- import { IAMConfigService } from './iam-config.service';
34
- export class IAMDataSourceService extends MultiTenantDataSourceService {
35
- static buildParentOptions(options) {
36
- return {
37
- bootstrapAppConfig: options.bootstrapAppConfig,
38
- defaultDatabaseConfig: options.config?.defaultDatabaseConfig,
39
- tenantDefaultDatabaseConfig: options.config?.tenantDefaultDatabaseConfig,
40
- tenants: options.config?.tenants
41
- };
42
- }
43
- getEnableCompanyFeatureForTenant(tenant) {
44
- return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
45
- }
46
- async getIAMEntities() {
47
- const { getIAMEntitiesByConfig } = await import('../entities');
48
- const enableCompanyFeature = this.getEnableCompanyFeatureForTenant(this.getCurrentTenant() ?? undefined);
49
- const permissionMode = PermissionModeHelper.toString(this.configService.getPermissionMode());
50
- return getIAMEntitiesByConfig(enableCompanyFeature, permissionMode);
51
- }
52
- async createDataSourceFromConfig(config) {
53
- const entities = await this.getIAMEntities();
54
- return await super.createDataSourceFromConfig(config, entities);
55
- }
56
- constructor(configService, request){
57
- super(IAMDataSourceService.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), this.configService = configService;
58
- }
59
- }
60
- _define_property(IAMDataSourceService, "tenantConnections", new Map());
61
- _define_property(IAMDataSourceService, "singleDataSource", null);
62
- _define_property(IAMDataSourceService, "tenantsRegistry", new Map());
63
- _define_property(IAMDataSourceService, "initialized", false);
64
- _define_property(IAMDataSourceService, "connectionLocks", new Map());
65
- _define_property(IAMDataSourceService, "singleConnectionLock", null);
66
- IAMDataSourceService = _ts_decorate([
67
- Injectable({
68
- scope: Scope.REQUEST
69
- }),
70
- _ts_param(0, Inject(IAMConfigService)),
71
- _ts_param(1, Optional()),
72
- _ts_param(1, Inject(REQUEST)),
73
- _ts_metadata("design:type", Function),
74
- _ts_metadata("design:paramtypes", [
75
- typeof IAMConfigService === "undefined" ? Object : IAMConfigService,
76
- typeof Request === "undefined" ? Object : Request
77
- ])
78
- ], IAMDataSourceService);
@@ -1,106 +0,0 @@
1
- import { MultiTenantDataSourceService } from '@flusys/nestjs-shared/modules';
2
- import { Action } from '../entities/action.entity';
3
- import { UserIamPermission } from '../entities/user-iam-permission.entity';
4
- import { UserIamPermissionWithCompany } from '../entities/permission-with-company.entity';
5
- import { Role } from '../entities/role.entity';
6
- import { RoleWithCompany } from '../entities/role-with-company.entity';
7
- import { IAMDataSourceService } from './iam-datasource.service';
8
- describe('IAMDataSourceService', ()=>{
9
- let mockConfigService;
10
- beforeEach(()=>{
11
- mockConfigService = {
12
- isCompanyFeatureEnabled: jest.fn().mockReturnValue(false),
13
- getPermissionMode: jest.fn(),
14
- getOptions: jest.fn().mockReturnValue({
15
- global: false,
16
- includeController: false
17
- })
18
- };
19
- });
20
- function buildService(request) {
21
- return new IAMDataSourceService(mockConfigService, request);
22
- }
23
- describe('getEnableCompanyFeatureForTenant', ()=>{
24
- it('uses the tenant override when defined (true)', ()=>{
25
- const service = buildService();
26
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
27
- expect(service.getEnableCompanyFeatureForTenant({
28
- enableCompanyFeature: true
29
- })).toBe(true);
30
- });
31
- it('uses the tenant override when defined (false)', ()=>{
32
- const service = buildService();
33
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
34
- expect(service.getEnableCompanyFeatureForTenant({
35
- enableCompanyFeature: false
36
- })).toBe(false);
37
- });
38
- it('falls back to the config service when the tenant has no override', ()=>{
39
- const service = buildService();
40
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
41
- expect(service.getEnableCompanyFeatureForTenant({})).toBe(true);
42
- });
43
- it('falls back to the config service when no tenant is provided', ()=>{
44
- const service = buildService();
45
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
46
- expect(service.getEnableCompanyFeatureForTenant(undefined)).toBe(true);
47
- });
48
- });
49
- describe('getIAMEntities', ()=>{
50
- it('returns Action + non-company permission + role entities for RBAC mode', async ()=>{
51
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
52
- mockConfigService.getPermissionMode.mockReturnValue(1); // RBAC
53
- const service = buildService();
54
- const entities = await service.getIAMEntities();
55
- expect(entities).toContain(Action);
56
- expect(entities).toContain(UserIamPermission);
57
- expect(entities).toContain(Role);
58
- expect(entities).not.toContain(UserIamPermissionWithCompany);
59
- expect(entities).not.toContain(RoleWithCompany);
60
- });
61
- it('returns company-scoped entities when company feature is enabled', async ()=>{
62
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(true);
63
- mockConfigService.getPermissionMode.mockReturnValue(3); // FULL
64
- const service = buildService();
65
- const entities = await service.getIAMEntities();
66
- expect(entities).toContain(Action);
67
- expect(entities).toContain(UserIamPermissionWithCompany);
68
- expect(entities).toContain(RoleWithCompany);
69
- expect(entities).not.toContain(UserIamPermission);
70
- expect(entities).not.toContain(Role);
71
- });
72
- it('excludes role entities entirely in DIRECT mode', async ()=>{
73
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
74
- mockConfigService.getPermissionMode.mockReturnValue(2); // DIRECT
75
- const service = buildService();
76
- const entities = await service.getIAMEntities();
77
- expect(entities).toEqual([
78
- Action,
79
- UserIamPermission
80
- ]);
81
- });
82
- });
83
- describe('createDataSourceFromConfig', ()=>{
84
- it('resolves IAM entities and delegates to the parent with them', async ()=>{
85
- mockConfigService.isCompanyFeatureEnabled.mockReturnValue(false);
86
- mockConfigService.getPermissionMode.mockReturnValue(1); // RBAC
87
- const service = buildService();
88
- const fakeDataSource = {
89
- isInitialized: true
90
- };
91
- const parentSpy = jest.spyOn(MultiTenantDataSourceService.prototype, 'createDataSourceFromConfig').mockResolvedValue(fakeDataSource);
92
- const config = {
93
- type: 'mysql',
94
- host: 'localhost'
95
- };
96
- const result = await service.createDataSourceFromConfig(config);
97
- expect(result).toBe(fakeDataSource);
98
- expect(parentSpy).toHaveBeenCalledWith(config, [
99
- Action,
100
- UserIamPermission,
101
- Role
102
- ]);
103
- parentSpy.mockRestore();
104
- });
105
- });
106
- });