@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.
- package/README.md +219 -118
- package/cjs/controllers/company-action-permission.controller.js +2 -17
- package/cjs/controllers/my-permission.controller.js +1 -2
- package/cjs/controllers/role-permission.controller.js +3 -9
- package/cjs/controllers/user-action-permission.controller.js +3 -9
- package/cjs/dtos/action.dto.js +0 -27
- package/cjs/dtos/permission.dto.js +81 -27
- package/cjs/dtos/role.dto.js +0 -27
- package/cjs/helpers/company-access.helper.js +19 -0
- package/cjs/helpers/index.js +1 -1
- package/cjs/interfaces/iam-module-options.interface.js +0 -14
- package/cjs/interfaces/index.js +0 -1
- package/cjs/modules/iam.module.js +38 -106
- package/cjs/services/action.service.js +30 -41
- package/cjs/services/iam-config.service.js +2 -5
- package/cjs/services/{iam-datasource.provider.js → iam-datasource.service.js} +33 -36
- package/cjs/services/index.js +1 -1
- package/cjs/services/permission-cache.service.js +6 -46
- package/cjs/services/permission.service.js +52 -41
- package/cjs/services/role.service.js +3 -3
- package/controllers/company-action-permission.controller.d.ts +2 -5
- package/controllers/role-permission.controller.d.ts +0 -1
- package/controllers/user-action-permission.controller.d.ts +0 -1
- package/dtos/action.dto.d.ts +0 -4
- package/dtos/role.dto.d.ts +0 -4
- package/fesm/controllers/company-action-permission.controller.js +4 -19
- package/fesm/controllers/my-permission.controller.js +1 -2
- package/fesm/controllers/role-permission.controller.js +4 -10
- package/fesm/controllers/user-action-permission.controller.js +4 -10
- package/fesm/dtos/action.dto.js +0 -24
- package/fesm/dtos/permission.dto.js +81 -27
- package/fesm/dtos/role.dto.js +0 -24
- package/fesm/helpers/company-access.helper.js +14 -0
- package/fesm/helpers/index.js +1 -1
- package/fesm/interfaces/iam-module-options.interface.js +3 -1
- package/fesm/interfaces/index.js +0 -1
- package/fesm/modules/iam.module.js +40 -108
- package/fesm/services/action.service.js +31 -42
- package/fesm/services/iam-config.service.js +2 -5
- package/fesm/services/{iam-datasource.provider.js → iam-datasource.service.js} +31 -34
- package/fesm/services/index.js +1 -1
- package/fesm/services/permission-cache.service.js +6 -46
- package/fesm/services/permission.service.js +53 -42
- package/fesm/services/role.service.js +3 -3
- package/helpers/company-access.helper.d.ts +3 -0
- package/helpers/index.d.ts +1 -1
- package/interfaces/iam-module-options.interface.d.ts +9 -1
- package/interfaces/index.d.ts +0 -1
- package/modules/iam.module.d.ts +1 -2
- package/package.json +3 -3
- package/services/action.service.d.ts +6 -4
- package/services/iam-config.service.d.ts +0 -1
- package/services/{iam-datasource.provider.d.ts → iam-datasource.service.d.ts} +4 -5
- package/services/index.d.ts +1 -1
- package/services/permission-cache.service.d.ts +1 -4
- package/services/permission.service.d.ts +4 -2
- package/services/role.service.d.ts +3 -3
- package/cjs/helpers/permission-evaluator.helper.js +0 -175
- package/cjs/interfaces/iam-module-async-options.interface.js +0 -4
- package/fesm/helpers/permission-evaluator.helper.js +0 -165
- package/fesm/interfaces/iam-module-async-options.interface.js +0 -3
- package/helpers/permission-evaluator.helper.d.ts +0 -26
- 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
|
|
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
|
-
|
|
199
|
+
---
|
|
172
200
|
|
|
173
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
**
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
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 `
|
|
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
|
-
###
|
|
715
|
+
### Exports
|
|
610
716
|
|
|
611
717
|
```typescript
|
|
612
|
-
|
|
613
|
-
|
|
718
|
+
// Config
|
|
719
|
+
export { IAM_MODULE_OPTIONS } from './config';
|
|
614
720
|
|
|
615
|
-
|
|
721
|
+
// Modules
|
|
722
|
+
export { IAMModule } from './modules';
|
|
616
723
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
} from '
|
|
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
|
-
|
|
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
|
-
|
|
631
|
-
|
|
632
|
-
|
|
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
|
-
|
|
747
|
+
// Enums
|
|
748
|
+
export { ActionType } from './enums/action-type.enum';
|
|
749
|
+
export { IAMPermissionMode } from './enums/permission-type.enum';
|
|
642
750
|
|
|
643
|
-
|
|
644
|
-
|
|
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
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
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
|
-
###
|
|
764
|
+
### Module Static Methods
|
|
670
765
|
|
|
671
766
|
```typescript
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
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
|
-
│
|
|
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.
|
|
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
|
-
│ ├──
|
|
711
|
-
│ └── permission-mode.helper.ts
|
|
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
|
-
│
|
|
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
|
-
|
|
725
|
-
|
|
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-
|
|
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
|
-
|
|
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)(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
package/cjs/dtos/action.dto.js
CHANGED
|
@@ -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);
|