@flusys/nestjs-iam 1.0.0-rc → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +219 -118
  2. package/cjs/controllers/company-action-permission.controller.js +2 -17
  3. package/cjs/controllers/my-permission.controller.js +1 -2
  4. package/cjs/controllers/role-permission.controller.js +3 -9
  5. package/cjs/controllers/user-action-permission.controller.js +3 -9
  6. package/cjs/dtos/action.dto.js +0 -27
  7. package/cjs/dtos/permission.dto.js +81 -27
  8. package/cjs/dtos/role.dto.js +0 -27
  9. package/cjs/helpers/company-access.helper.js +19 -0
  10. package/cjs/helpers/index.js +1 -1
  11. package/cjs/interfaces/iam-module-options.interface.js +0 -14
  12. package/cjs/interfaces/index.js +0 -1
  13. package/cjs/modules/iam.module.js +38 -106
  14. package/cjs/services/action.service.js +30 -41
  15. package/cjs/services/iam-config.service.js +2 -5
  16. package/cjs/services/{iam-datasource.provider.js → iam-datasource.service.js} +33 -36
  17. package/cjs/services/index.js +1 -1
  18. package/cjs/services/permission-cache.service.js +6 -46
  19. package/cjs/services/permission.service.js +52 -41
  20. package/cjs/services/role.service.js +3 -3
  21. package/controllers/company-action-permission.controller.d.ts +2 -5
  22. package/controllers/role-permission.controller.d.ts +0 -1
  23. package/controllers/user-action-permission.controller.d.ts +0 -1
  24. package/dtos/action.dto.d.ts +0 -4
  25. package/dtos/role.dto.d.ts +0 -4
  26. package/fesm/controllers/company-action-permission.controller.js +4 -19
  27. package/fesm/controllers/my-permission.controller.js +1 -2
  28. package/fesm/controllers/role-permission.controller.js +4 -10
  29. package/fesm/controllers/user-action-permission.controller.js +4 -10
  30. package/fesm/dtos/action.dto.js +0 -24
  31. package/fesm/dtos/permission.dto.js +81 -27
  32. package/fesm/dtos/role.dto.js +0 -24
  33. package/fesm/helpers/company-access.helper.js +14 -0
  34. package/fesm/helpers/index.js +1 -1
  35. package/fesm/interfaces/iam-module-options.interface.js +3 -1
  36. package/fesm/interfaces/index.js +0 -1
  37. package/fesm/modules/iam.module.js +40 -108
  38. package/fesm/services/action.service.js +31 -42
  39. package/fesm/services/iam-config.service.js +2 -5
  40. package/fesm/services/{iam-datasource.provider.js → iam-datasource.service.js} +31 -34
  41. package/fesm/services/index.js +1 -1
  42. package/fesm/services/permission-cache.service.js +6 -46
  43. package/fesm/services/permission.service.js +53 -42
  44. package/fesm/services/role.service.js +3 -3
  45. package/helpers/company-access.helper.d.ts +3 -0
  46. package/helpers/index.d.ts +1 -1
  47. package/interfaces/iam-module-options.interface.d.ts +9 -1
  48. package/interfaces/index.d.ts +0 -1
  49. package/modules/iam.module.d.ts +1 -2
  50. package/package.json +3 -3
  51. package/services/action.service.d.ts +6 -4
  52. package/services/iam-config.service.d.ts +0 -1
  53. package/services/{iam-datasource.provider.d.ts → iam-datasource.service.d.ts} +4 -5
  54. package/services/index.d.ts +1 -1
  55. package/services/permission-cache.service.d.ts +1 -4
  56. package/services/permission.service.d.ts +4 -2
  57. package/services/role.service.d.ts +3 -3
  58. package/cjs/helpers/permission-evaluator.helper.js +0 -175
  59. package/cjs/interfaces/iam-module-async-options.interface.js +0 -4
  60. package/fesm/helpers/permission-evaluator.helper.js +0 -165
  61. package/fesm/interfaces/iam-module-async-options.interface.js +0 -3
  62. package/helpers/permission-evaluator.helper.d.ts +0 -26
  63. package/interfaces/iam-module-async-options.interface.d.ts +0 -11
package/README.md CHANGED
@@ -8,11 +8,13 @@
8
8
  - [Overview](#overview)
9
9
  - [Installation](#installation)
10
10
  - [Module Configuration](#module-configuration)
11
+ - [Constants](#constants)
11
12
  - [Core Concepts](#core-concepts)
12
13
  - [Entities](#entities)
13
14
  - [Permission Modes](#permission-modes)
14
15
  - [Permission Logic](#permission-logic)
15
16
  - [Services](#services)
17
+ - [Helpers](#helpers)
16
18
  - [REST API Endpoints](#rest-api-endpoints)
17
19
  - [Multi-Tenant Support](#multi-tenant-support)
18
20
  - [Permission Guard Integration](#permission-guard-integration)
@@ -89,6 +91,34 @@ import { IAMModule } from '@flusys/nestjs-iam';
89
91
  export class AppModule {}
90
92
  ```
91
93
 
94
+ ### Async Configuration
95
+
96
+ ```typescript
97
+ IAMModule.forRootAsync({
98
+ global: true,
99
+ includeController: true,
100
+ bootstrapAppConfig: {
101
+ databaseMode: 'single',
102
+ enableCompanyFeature: true,
103
+ permissionMode: 'RBAC',
104
+ },
105
+ imports: [ConfigModule],
106
+ useFactory: (config: ConfigService) => ({
107
+ // IAM-specific options from config
108
+ }),
109
+ inject: [ConfigService],
110
+ })
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Constants
116
+
117
+ ```typescript
118
+ // Injection Token
119
+ export const IAM_MODULE_OPTIONS = 'IAM_MODULE_OPTIONS';
120
+ ```
121
+
92
122
  ---
93
123
 
94
124
  ## Core Concepts
@@ -148,9 +178,7 @@ enum IamPermissionType {
148
178
 
149
179
  ### Permission Cascade Deletion
150
180
 
151
- When removing company actions via `removeCompanyActionsWithCascade()`, the `PermissionService` performs cascade deletion to maintain permission consistency:
152
-
153
- **Cascade Flow:**
181
+ When removing company actions via `removeCompanyActionsWithCascade()`, the `PermissionService` performs cascade deletion:
154
182
 
155
183
  ```
156
184
  Company Action Removed
@@ -168,29 +196,54 @@ Company Action Removed
168
196
  6. Invalidate permission cache for affected users
169
197
  ```
170
198
 
171
- **Example:**
199
+ ---
172
200
 
173
- ```typescript
174
- // Remove actions from company whitelist with cascade
175
- await permissionService.assignCompanyActions({
176
- companyId: 'company-id',
177
- items: [
178
- { id: 'action-id-1', action: PermissionAction.REMOVE },
179
- { id: 'action-id-2', action: PermissionAction.REMOVE },
180
- ],
181
- });
182
- ```
201
+ ## Entities
183
202
 
184
- This ensures that when a company loses access to an action:
185
- - All roles in that company lose the action
186
- - All users in that company lose direct assignments to the action
187
- - Permission cache is invalidated so guards reflect the change immediately
203
+ ### Entity Groups
188
204
 
189
- **Note:** The cascade only affects permissions within the specified company. Other companies' permissions remain unchanged.
205
+ ```typescript
206
+ // Core entities (no company feature)
207
+ export const IAMCoreEntities = [Action, Role, UserIamPermission];
190
208
 
191
- ---
209
+ // Company-specific entities
210
+ export const IAMCompanyEntities = [RoleWithCompany, UserIamPermissionWithCompany];
192
211
 
193
- ## Entities
212
+ // All entities
213
+ export const IAMAllEntities = [
214
+ Action,
215
+ Role,
216
+ RoleWithCompany,
217
+ UserIamPermission,
218
+ UserIamPermissionWithCompany,
219
+ ];
220
+
221
+ // Helper function
222
+ export function getIAMEntitiesByConfig(
223
+ enableCompanyFeature: boolean,
224
+ permissionMode: 'FULL' | 'RBAC' | 'DIRECT' = 'FULL',
225
+ ): any[] {
226
+ const entities: any[] = [Action];
227
+
228
+ // Permission entity - always included
229
+ if (enableCompanyFeature) {
230
+ entities.push(UserIamPermissionWithCompany);
231
+ } else {
232
+ entities.push(UserIamPermission);
233
+ }
234
+
235
+ // Role entity - Only for RBAC or FULL mode (not DIRECT)
236
+ if (permissionMode === 'RBAC' || permissionMode === 'FULL') {
237
+ if (enableCompanyFeature) {
238
+ entities.push(RoleWithCompany);
239
+ } else {
240
+ entities.push(Role);
241
+ }
242
+ }
243
+
244
+ return entities;
245
+ }
246
+ ```
194
247
 
195
248
  ### ActionBase
196
249
 
@@ -264,6 +317,16 @@ Extends PermissionBase with:
264
317
 
265
318
  Set in `bootstrapAppConfig.permissionMode`:
266
319
 
320
+ ### Permission Mode Enum
321
+
322
+ ```typescript
323
+ enum IAMPermissionMode {
324
+ RBAC = 1, // Role-Based: Action + RoleAction + UserRole
325
+ DIRECT = 2, // Direct User Permissions: Action + UserAction
326
+ FULL = 3, // Both RBAC + Direct permissions
327
+ }
328
+ ```
329
+
267
330
  ### RBAC Mode (Role-Based)
268
331
 
269
332
  ```
@@ -293,15 +356,6 @@ User -> Action
293
356
 
294
357
  Both RBAC and direct permissions. Default mode. All assignment methods available.
295
358
 
296
- ### PermissionModeHelper
297
-
298
- ```typescript
299
- import { PermissionModeHelper } from '@flusys/nestjs-iam/helpers';
300
-
301
- const mode = PermissionModeHelper.fromString('RBAC');
302
- // Returns: IAMPermissionMode.RBAC
303
- ```
304
-
305
359
  ---
306
360
 
307
361
  ## Permission Logic
@@ -344,6 +398,15 @@ const logic: LogicNode = {
344
398
 
345
399
  ## Services
346
400
 
401
+ | Service | Scope | Description |
402
+ |---------|-------|-------------|
403
+ | `ActionService` | REQUEST | Action CRUD, tree queries |
404
+ | `RoleService` | REQUEST | Role CRUD (RBAC/FULL mode only) |
405
+ | `PermissionService` | REQUEST | Permission assignments, my-permissions |
406
+ | `PermissionCacheService` | REQUEST | Cache management |
407
+ | `IAMConfigService` | SINGLETON | IAM configuration access |
408
+ | `IAMDataSourceService` | REQUEST | DataSource provider for multi-tenant |
409
+
347
410
  ### ActionService
348
411
 
349
412
  ```typescript
@@ -383,7 +446,6 @@ await roleService.insert({
383
446
  import { PermissionService, PermissionAction } from '@flusys/nestjs-iam';
384
447
 
385
448
  // Assign roles to user (RBAC/FULL mode only)
386
- // Throws BadRequestException in DIRECT mode
387
449
  await permissionService.assignUserRoles({
388
450
  userId: 'user-id',
389
451
  companyId: 'company-id',
@@ -392,7 +454,6 @@ await permissionService.assignUserRoles({
392
454
  });
393
455
 
394
456
  // Assign actions directly (DIRECT/FULL mode only)
395
- // Throws BadRequestException in RBAC mode
396
457
  await permissionService.assignUserActions({
397
458
  userId: 'user-id',
398
459
  companyId: 'company-id',
@@ -401,13 +462,12 @@ await permissionService.assignUserActions({
401
462
  });
402
463
 
403
464
  // Assign actions to role (RBAC/FULL mode only)
404
- // Throws BadRequestException in DIRECT mode
405
465
  await permissionService.assignRoleActions({
406
466
  roleId: 'role-id',
407
467
  items: [{ id: 'action-id', action: PermissionAction.ADD }],
408
468
  });
409
469
 
410
- // Get user's permissions (collects from RBAC + DIRECT based on mode)
470
+ // Get user's permissions
411
471
  const permissions = await permissionService.getMyPermissions(
412
472
  userId, branchId, companyId, parentCodes
413
473
  );
@@ -446,6 +506,51 @@ action-codes:tenant:{tenantId}:map // Multi-tenant
446
506
 
447
507
  ---
448
508
 
509
+ ## Helpers
510
+
511
+ ### PermissionModeHelper
512
+
513
+ Centralizes conversion from string to enum to prevent duplication:
514
+
515
+ ```typescript
516
+ import { PermissionModeHelper } from '@flusys/nestjs-iam';
517
+
518
+ // Convert string to enum
519
+ const mode = PermissionModeHelper.fromString('RBAC');
520
+ // Returns: IAMPermissionMode.RBAC
521
+
522
+ const mode = PermissionModeHelper.fromString(undefined);
523
+ // Returns: IAMPermissionMode.FULL (default)
524
+
525
+ // Convert enum to string
526
+ const str = PermissionModeHelper.toString(IAMPermissionMode.RBAC);
527
+ // Returns: 'RBAC'
528
+ ```
529
+
530
+ **Used by:**
531
+ - `iam.module.ts` (forRoot, forRootAsync)
532
+ - `iam-config.service.ts` (getPermissionMode)
533
+ - `main.ts` (Swagger setup)
534
+
535
+ ### validateCompanyAccess
536
+
537
+ Validates user access to a company for permission operations:
538
+
539
+ ```typescript
540
+ import { validateCompanyAccess } from '@flusys/nestjs-iam';
541
+
542
+ // In a controller or service
543
+ validateCompanyAccess(
544
+ iamConfig,
545
+ dto.companyId,
546
+ user,
547
+ 'You do not have access to this company',
548
+ );
549
+ // Throws ForbiddenException if user.companyId !== dto.companyId
550
+ ```
551
+
552
+ ---
553
+
449
554
  ## REST API Endpoints
450
555
 
451
556
  ### Actions API
@@ -460,7 +565,7 @@ action-codes:tenant:{tenantId}:map // Multi-tenant
460
565
  | `/iam/actions/update` | POST | Update action |
461
566
  | `/iam/actions/delete` | POST | Delete action |
462
567
 
463
- ### Roles API
568
+ ### Roles API (RBAC/FULL mode only)
464
569
 
465
570
  | Endpoint | Method | Description |
466
571
  |----------|--------|-------------|
@@ -472,25 +577,25 @@ action-codes:tenant:{tenantId}:map // Multi-tenant
472
577
 
473
578
  ### Permissions API
474
579
 
475
- | Endpoint | Method | Description |
476
- |----------|--------|-------------|
477
- | `/iam/permissions/role-actions/assign` | POST | Assign actions to role |
478
- | `/iam/permissions/role-actions/get` | POST | Get role actions |
479
- | `/iam/permissions/user-roles/assign` | POST | Assign roles to user |
480
- | `/iam/permissions/user-roles/get` | POST | Get user roles |
481
- | `/iam/permissions/user-actions/assign` | POST | Assign actions to user |
482
- | `/iam/permissions/user-actions/get` | POST | Get user actions |
483
- | `/iam/permissions/company-actions/assign` | POST | Company action whitelist |
484
- | `/iam/permissions/company-actions/get` | POST | Get company actions |
485
- | `/iam/permissions/my-permissions` | POST | Get current user's permissions |
486
-
487
- **My Permissions Response:**
488
- ```typescript
489
- {
490
- frontendActions: FrontendActionDto[],
491
- cachedEndpoints: number
492
- }
493
- ```
580
+ | Endpoint | Method | Modes | Description |
581
+ |----------|--------|-------|-------------|
582
+ | `/iam/permissions/role-actions/assign` | POST | RBAC, FULL | Assign actions to role |
583
+ | `/iam/permissions/role-actions/get` | POST | RBAC, FULL | Get role actions |
584
+ | `/iam/permissions/user-roles/assign` | POST | RBAC, FULL | Assign roles to user |
585
+ | `/iam/permissions/user-roles/get` | POST | RBAC, FULL | Get user roles |
586
+ | `/iam/permissions/user-actions/assign` | POST | DIRECT, FULL | Assign actions to user |
587
+ | `/iam/permissions/user-actions/get` | POST | DIRECT, FULL | Get user actions |
588
+ | `/iam/permissions/company-actions/assign` | POST | All (company enabled) | Company action whitelist |
589
+ | `/iam/permissions/company-actions/get` | POST | All (company enabled) | Get company actions |
590
+ | `/iam/permissions/my-permissions` | POST | All | Get current user's permissions |
591
+
592
+ **Controller Registration by Mode:**
593
+
594
+ | Mode | Controllers |
595
+ |------|-------------|
596
+ | DIRECT | ActionController, MyPermissionController, UserActionPermissionController |
597
+ | RBAC | ActionController, MyPermissionController, RoleController, RolePermissionController |
598
+ | FULL | All controllers |
494
599
 
495
600
  ---
496
601
 
@@ -503,6 +608,7 @@ action-codes:tenant:{tenantId}:map // Multi-tenant
503
608
  export const bootstrapAppConfig: IBootstrapAppConfig = {
504
609
  databaseMode: 'single', // or 'multi-tenant'
505
610
  enableCompanyFeature: true,
611
+ permissionMode: 'FULL',
506
612
  };
507
613
  ```
508
614
 
@@ -525,7 +631,7 @@ export const bootstrapAppConfig: IBootstrapAppConfig = {
525
631
  When `databaseMode: 'multi-tenant'`:
526
632
  - Each tenant has isolated database/schema
527
633
  - Action code cache is tenant-aware (separate cache per tenant)
528
- - Uses `IAMDataSourceProvider` for tenant-specific connections
634
+ - Uses `IAMDataSourceService` for tenant-specific connections
529
635
 
530
636
  ### Permission Merging
531
637
 
@@ -606,73 +712,62 @@ Direct actions should be exceptions and branch-specific overrides, not the prima
606
712
 
607
713
  ## API Reference
608
714
 
609
- ### Module
715
+ ### Exports
610
716
 
611
717
  ```typescript
612
- import { IAMModule, IAMPermissionMode } from '@flusys/nestjs-iam';
613
- ```
718
+ // Config
719
+ export { IAM_MODULE_OPTIONS } from './config';
614
720
 
615
- ### Services
721
+ // Modules
722
+ export { IAMModule } from './modules';
616
723
 
617
- ```typescript
618
- import {
619
- ActionService,
620
- RoleService,
621
- PermissionService,
622
- PermissionCacheService,
623
- IAMConfigService,
624
- IAMDataSourceProvider,
625
- } from '@flusys/nestjs-iam';
626
- ```
724
+ // Entities
725
+ export { Action } from './entities/action.entity';
726
+ export { ActionBase } from './entities/action-base.entity';
727
+ export { Role } from './entities/role.entity';
728
+ export { RoleBase } from './entities/role-base.entity';
729
+ export { RoleWithCompany } from './entities/role-with-company.entity';
730
+ export { PermissionBase } from './entities/permission-base.entity';
731
+ export { UserIamPermission } from './entities/user-iam-permission.entity';
732
+ export { UserIamPermissionWithCompany } from './entities/permission-with-company.entity';
733
+ export { IAMCoreEntities, IAMCompanyEntities, IAMAllEntities, getIAMEntitiesByConfig } from './entities';
627
734
 
628
- ### Entities
735
+ // Services
736
+ export { ActionService } from './services/action.service';
737
+ export { RoleService } from './services/role.service';
738
+ export { PermissionService } from './services/permission.service';
739
+ export { PermissionCacheService } from './services/permission-cache.service';
740
+ export { IAMConfigService } from './services/iam-config.service';
741
+ export { IAMDataSourceService } from './services/iam-datasource.service';
629
742
 
630
- ```typescript
631
- import {
632
- Action,
633
- Role,
634
- RoleWithCompany,
635
- UserIamPermission,
636
- UserIamPermissionWithCompany,
637
- getIAMEntitiesByConfig,
638
- } from '@flusys/nestjs-iam/entities';
639
- ```
743
+ // Helpers
744
+ export { PermissionModeHelper } from './helpers/permission-mode.helper';
745
+ export { validateCompanyAccess } from './helpers/company-access.helper';
640
746
 
641
- ### DTOs
747
+ // Enums
748
+ export { ActionType } from './enums/action-type.enum';
749
+ export { IAMPermissionMode } from './enums/permission-type.enum';
642
750
 
643
- ```typescript
644
- import {
645
- CreateActionDto,
646
- UpdateActionDto,
647
- CreateRoleDto,
648
- UpdateRoleDto,
649
- AssignUserActionsDto,
650
- AssignUserRolesDto,
651
- AssignRoleActionsDto,
652
- AssignCompanyActionsDto,
653
- MyPermissionsResponseDto,
654
- FrontendActionDto,
655
- } from '@flusys/nestjs-iam/dtos';
656
- ```
657
-
658
- ### Enums
751
+ // Types
752
+ export { LogicNode } from './types/logic-node.type';
659
753
 
660
- ```typescript
661
- import {
662
- ActionType,
663
- IAMPermissionMode,
664
- IamPermissionType,
665
- IamEntityType,
666
- } from '@flusys/nestjs-iam/enums';
754
+ // DTOs
755
+ export * from './dtos';
756
+
757
+ // Interfaces
758
+ export * from './interfaces';
759
+
760
+ // Swagger Config
761
+ export { iamSwaggerConfig } from './docs';
667
762
  ```
668
763
 
669
- ### Helpers
764
+ ### Module Static Methods
670
765
 
671
766
  ```typescript
672
- import { PermissionModeHelper } from '@flusys/nestjs-iam/helpers';
673
-
674
- // Convert string to permission mode enum
675
- const mode = PermissionModeHelper.fromString('RBAC'); // IAMPermissionMode.RBAC
767
+ // Configure module
768
+ IAMModule.forRoot(options?: IAMModuleOptions): DynamicModule
769
+ IAMModule.forRootAsync(options: IAMModuleAsyncOptions): DynamicModule
770
+ IAMModule.forFeature(options?: IAMModuleOptions): DynamicModule
676
771
  ```
677
772
 
678
773
  ---
@@ -681,6 +776,9 @@ const mode = PermissionModeHelper.fromString('RBAC'); // IAMPermissionMode.RBAC
681
776
 
682
777
  ```
683
778
  nestjs-iam/src/
779
+ ├── config/
780
+ │ ├── iam.constants.ts # IAM_MODULE_OPTIONS token
781
+ │ └── index.ts
684
782
  ├── modules/
685
783
  │ └── iam.module.ts # Main module with dynamic config
686
784
  ├── entities/
@@ -691,14 +789,15 @@ nestjs-iam/src/
691
789
  │ ├── role-with-company.entity.ts
692
790
  │ ├── permission-base.entity.ts # Permission base fields
693
791
  │ ├── user-iam-permission.entity.ts
694
- └── permission-with-company.entity.ts
792
+ ├── permission-with-company.entity.ts
793
+ │ └── index.ts # Entity groups & getIAMEntitiesByConfig
695
794
  ├── services/
696
795
  │ ├── action.service.ts # Action CRUD
697
796
  │ ├── role.service.ts # Role CRUD
698
797
  │ ├── permission.service.ts # Permission management
699
798
  │ ├── permission-cache.service.ts # Cache management
700
799
  │ ├── iam-config.service.ts # Configuration
701
- │ └── iam-datasource.provider.ts # DataSource provider
800
+ │ └── iam-datasource.service.ts # DataSource provider
702
801
  ├── controllers/
703
802
  │ ├── action.controller.ts
704
803
  │ ├── role.controller.ts
@@ -707,8 +806,8 @@ nestjs-iam/src/
707
806
  │ ├── user-action-permission.controller.ts
708
807
  │ └── company-action-permission.controller.ts
709
808
  ├── helpers/
710
- │ ├── permission-evaluator.helper.ts # Logic evaluation (AND/OR)
711
- │ └── permission-mode.helper.ts # String to enum conversion
809
+ │ ├── company-access.helper.ts # Company access validation
810
+ │ └── permission-mode.helper.ts # String to enum conversion
712
811
  ├── dtos/
713
812
  │ ├── action.dto.ts
714
813
  │ ├── role.dto.ts
@@ -716,15 +815,17 @@ nestjs-iam/src/
716
815
  ├── interfaces/
717
816
  │ ├── action.interface.ts
718
817
  │ ├── role.interface.ts
719
- ├── iam-module-options.interface.ts
720
- │ └── iam-module-async-options.interface.ts
818
+ └── iam-module-options.interface.ts
721
819
  ├── enums/
722
820
  │ ├── action-type.enum.ts
723
821
  │ └── permission-type.enum.ts
724
- └── types/
725
- └── logic-node.type.ts
822
+ ├── types/
823
+ └── logic-node.type.ts
824
+ ├── docs/
825
+ │ └── iam-swagger.config.ts
826
+ └── index.ts
726
827
  ```
727
828
 
728
829
  ---
729
830
 
730
- **Last Updated:** 2026-02-18
831
+ **Last Updated:** 2026-02-21
@@ -13,7 +13,6 @@ const _common = require("@nestjs/common");
13
13
  const _swagger = require("@nestjs/swagger");
14
14
  const _permissiondto = require("../dtos/permission.dto");
15
15
  const _permissionservice = require("../services/permission.service");
16
- const _iamconfigservice = require("../services/iam-config.service");
17
16
  function _define_property(obj, key, value) {
18
17
  if (key in obj) {
19
18
  Object.defineProperty(obj, key, {
@@ -42,19 +41,10 @@ function _ts_param(paramIndex, decorator) {
42
41
  };
43
42
  }
44
43
  let CompanyActionPermissionController = class CompanyActionPermissionController {
45
- /** Validates that user can only manage permissions for their own company */ validateCompanyAccess(companyId, user) {
46
- if (this.config.isCompanyFeatureEnabled() && user.companyId) {
47
- if (companyId !== user.companyId) {
48
- throw new _common.BadRequestException('Cannot manage permissions for another company');
49
- }
50
- }
51
- }
52
44
  async assignCompanyActions(dto, user) {
53
- this.validateCompanyAccess(dto.companyId, user);
54
45
  return this.permissionService.assignCompanyActions(dto);
55
46
  }
56
47
  async getCompanyActions(dto, user) {
57
- this.validateCompanyAccess(dto.companyId, user);
58
48
  const actions = await this.permissionService.getCompanyActions(dto.companyId);
59
49
  return {
60
50
  success: true,
@@ -62,12 +52,9 @@ let CompanyActionPermissionController = class CompanyActionPermissionController
62
52
  data: actions
63
53
  };
64
54
  }
65
- // NOTE: @Inject() required for bundled code - type metadata may be lost during esbuild
66
- constructor(permissionService, config){
55
+ constructor(permissionService){
67
56
  _define_property(this, "permissionService", void 0);
68
- _define_property(this, "config", void 0);
69
57
  this.permissionService = permissionService;
70
- this.config = config;
71
58
  }
72
59
  };
73
60
  _ts_decorate([
@@ -122,10 +109,8 @@ CompanyActionPermissionController = _ts_decorate([
122
109
  (0, _common.UseGuards)(_nestjsshared.JwtAuthGuard),
123
110
  (0, _swagger.ApiBearerAuth)(),
124
111
  _ts_param(0, (0, _common.Inject)(_permissionservice.PermissionService)),
125
- _ts_param(1, (0, _common.Inject)(_iamconfigservice.IAMConfigService)),
126
112
  _ts_metadata("design:type", Function),
127
113
  _ts_metadata("design:paramtypes", [
128
- typeof _permissionservice.PermissionService === "undefined" ? Object : _permissionservice.PermissionService,
129
- typeof _iamconfigservice.IAMConfigService === "undefined" ? Object : _iamconfigservice.IAMConfigService
114
+ typeof _permissionservice.PermissionService === "undefined" ? Object : _permissionservice.PermissionService
130
115
  ])
131
116
  ], CompanyActionPermissionController);
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "MyPermissionController", {
9
9
  }
10
10
  });
11
11
  const _nestjsshared = require("@flusys/nestjs-shared");
12
- const _guards = require("@flusys/nestjs-shared/guards");
13
12
  const _common = require("@nestjs/common");
14
13
  const _swagger = require("@nestjs/swagger");
15
14
  const _permissiondto = require("../dtos/permission.dto");
@@ -85,7 +84,7 @@ _ts_decorate([
85
84
  MyPermissionController = _ts_decorate([
86
85
  (0, _swagger.ApiTags)('IAM - My Permissions'),
87
86
  (0, _common.Controller)('iam/permissions'),
88
- (0, _common.UseGuards)(_guards.JwtAuthGuard),
87
+ (0, _common.UseGuards)(_nestjsshared.JwtAuthGuard),
89
88
  (0, _swagger.ApiBearerAuth)(),
90
89
  _ts_param(0, (0, _common.Inject)(_permissionservice.PermissionService)),
91
90
  _ts_metadata("design:type", Function),
@@ -12,6 +12,7 @@ const _nestjsshared = require("@flusys/nestjs-shared");
12
12
  const _common = require("@nestjs/common");
13
13
  const _swagger = require("@nestjs/swagger");
14
14
  const _permissiondto = require("../dtos/permission.dto");
15
+ const _helpers = require("../helpers");
15
16
  const _permissionservice = require("../services/permission.service");
16
17
  const _iamconfigservice = require("../services/iam-config.service");
17
18
  function _define_property(obj, key, value) {
@@ -42,13 +43,6 @@ function _ts_param(paramIndex, decorator) {
42
43
  };
43
44
  }
44
45
  let RolePermissionController = class RolePermissionController {
45
- /** Validates that user can only manage permissions within their company */ validateCompanyAccess(companyId, user) {
46
- if (this.config.isCompanyFeatureEnabled() && user.companyId && companyId) {
47
- if (companyId !== user.companyId) {
48
- throw new _common.BadRequestException('Cannot manage permissions for users in another company');
49
- }
50
- }
51
- }
52
46
  async assignRoleActions(dto) {
53
47
  return this.permissionService.assignRoleActions(dto);
54
48
  }
@@ -61,11 +55,11 @@ let RolePermissionController = class RolePermissionController {
61
55
  };
62
56
  }
63
57
  async assignUserRoles(dto, user) {
64
- this.validateCompanyAccess(dto.companyId, user);
58
+ (0, _helpers.validateCompanyAccess)(this.config, dto.companyId, user, 'Cannot manage permissions for users in another company');
65
59
  return this.permissionService.assignUserRoles(dto);
66
60
  }
67
61
  async getUserRoles(dto, user) {
68
- this.validateCompanyAccess(dto.companyId, user);
62
+ (0, _helpers.validateCompanyAccess)(this.config, dto.companyId, user, 'Cannot manage permissions for users in another company');
69
63
  const roles = await this.permissionService.getUserRoles(dto.userId, dto.branchId, dto.companyId);
70
64
  return {
71
65
  success: true,
@@ -12,6 +12,7 @@ const _nestjsshared = require("@flusys/nestjs-shared");
12
12
  const _common = require("@nestjs/common");
13
13
  const _swagger = require("@nestjs/swagger");
14
14
  const _permissiondto = require("../dtos/permission.dto");
15
+ const _helpers = require("../helpers");
15
16
  const _permissionservice = require("../services/permission.service");
16
17
  const _iamconfigservice = require("../services/iam-config.service");
17
18
  function _define_property(obj, key, value) {
@@ -42,19 +43,12 @@ function _ts_param(paramIndex, decorator) {
42
43
  };
43
44
  }
44
45
  let UserActionPermissionController = class UserActionPermissionController {
45
- /** Validates that user can only manage permissions within their company */ validateCompanyAccess(companyId, user) {
46
- if (this.config.isCompanyFeatureEnabled() && user.companyId && companyId) {
47
- if (companyId !== user.companyId) {
48
- throw new _common.BadRequestException('Cannot manage permissions for users in another company');
49
- }
50
- }
51
- }
52
46
  async assignUserActions(dto, user) {
53
- this.validateCompanyAccess(dto.companyId, user);
47
+ (0, _helpers.validateCompanyAccess)(this.config, dto.companyId, user, 'Cannot manage permissions for users in another company');
54
48
  return this.permissionService.assignUserActions(dto);
55
49
  }
56
50
  async getUserActions(dto, user) {
57
- this.validateCompanyAccess(dto.companyId, user);
51
+ (0, _helpers.validateCompanyAccess)(this.config, dto.companyId, user, 'Cannot manage permissions for users in another company');
58
52
  const actions = await this.permissionService.getUserActions(dto.userId, dto.branchId, dto.companyId);
59
53
  return {
60
54
  success: true,
@@ -9,9 +9,6 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- get ActionQueryDto () {
13
- return ActionQueryDto;
14
- },
15
12
  get ActionResponseDto () {
16
13
  return ActionResponseDto;
17
14
  },
@@ -284,30 +281,6 @@ _ts_decorate([
284
281
  }),
285
282
  _ts_metadata("design:type", Array)
286
283
  ], ActionTreeDto.prototype, "children", void 0);
287
- let ActionQueryDto = class ActionQueryDto {
288
- constructor(){
289
- _define_property(this, "isActive", void 0);
290
- _define_property(this, "parentId", void 0);
291
- }
292
- };
293
- _ts_decorate([
294
- (0, _swagger.ApiProperty)({
295
- description: 'Filter by active status',
296
- required: false
297
- }),
298
- (0, _classvalidator.IsBoolean)(),
299
- (0, _classvalidator.IsOptional)(),
300
- _ts_metadata("design:type", Boolean)
301
- ], ActionQueryDto.prototype, "isActive", void 0);
302
- _ts_decorate([
303
- (0, _swagger.ApiProperty)({
304
- description: 'Filter by parent ID',
305
- required: false
306
- }),
307
- (0, _classvalidator.IsUUID)(),
308
- (0, _classvalidator.IsOptional)(),
309
- _ts_metadata("design:type", String)
310
- ], ActionQueryDto.prototype, "parentId", void 0);
311
284
  let ActionTreeQueryDto = class ActionTreeQueryDto {
312
285
  constructor(){
313
286
  _define_property(this, "search", void 0);