@flusys/nestjs-shared 8.1.5 → 9.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.
Files changed (41) hide show
  1. package/README.md +48 -2
  2. package/classes/api-service.class.d.ts +3 -0
  3. package/constants/permissions.d.ts +46 -0
  4. package/exceptions/base-app.exception.d.ts +3 -2
  5. package/fesm/{509.js → 183.js} +43 -37
  6. package/fesm/470.js +228 -105
  7. package/fesm/667.js +28 -10
  8. package/fesm/{67.js → 681.js} +97 -19
  9. package/fesm/{720.js → 948.js} +60 -7
  10. package/fesm/chunks/123.js +9 -10
  11. package/fesm/chunks/37.js +7 -8
  12. package/fesm/classes/index.js +10 -4
  13. package/fesm/constants/index.js +53 -1
  14. package/fesm/decorators/index.js +4 -4
  15. package/fesm/dtos/index.js +2 -2
  16. package/fesm/guards/index.js +48 -426
  17. package/fesm/index.js +436 -341
  18. package/fesm/interceptors/index.js +62 -23
  19. package/fesm/interfaces/index.js +28 -3
  20. package/fesm/middlewares/index.js +5 -3
  21. package/fesm/modules/index.js +6 -414
  22. package/fesm/pipes/index.js +196 -0
  23. package/fesm/utils/index.js +125 -10
  24. package/index.d.ts +1 -0
  25. package/interfaces/company-access-resolver.interface.d.ts +18 -0
  26. package/interfaces/datasource.interface.d.ts +2 -0
  27. package/interfaces/email-adapter.interface.d.ts +27 -0
  28. package/interfaces/index.d.ts +5 -0
  29. package/interfaces/message-ref.interface.d.ts +4 -0
  30. package/interfaces/permission-action-registry.interface.d.ts +12 -0
  31. package/interfaces/permission-resolver.interface.d.ts +9 -0
  32. package/middlewares/logger.middleware.d.ts +4 -0
  33. package/modules/shared-permission-cache/shared-permission-cache.service.d.ts +5 -0
  34. package/package.json +9 -3
  35. package/pipes/dto-body-validation.pipe.d.ts +18 -0
  36. package/pipes/index.d.ts +1 -0
  37. package/utils/cache-tenant.util.d.ts +2 -0
  38. package/utils/index.d.ts +3 -0
  39. package/utils/message-ref.util.d.ts +2 -0
  40. package/utils/permission-match.util.d.ts +1 -0
  41. package/utils/query-helpers.util.d.ts +2 -1
@@ -127,7 +127,10 @@ const DEFAULT_EVENT_SERVICE_NAME = 'flusys';
127
127
  __webpack_require__.d(__webpack_exports__, {
128
128
  BC: () => (/* reexport safe */ _permissions_js__rspack_import_0.BC),
129
129
  Bz: () => (/* reexport safe */ _permissions_js__rspack_import_0.Bz),
130
+ DP: () => (/* reexport safe */ _permissions_js__rspack_import_0.DP),
130
131
  Em: () => (/* reexport safe */ _permissions_js__rspack_import_0.Em),
132
+ G0: () => (/* reexport safe */ _permissions_js__rspack_import_0.G0),
133
+ GH: () => (/* reexport safe */ _permissions_js__rspack_import_0.GH),
131
134
  GT: () => (/* reexport safe */ _permissions_js__rspack_import_0.GT),
132
135
  Jj: () => (/* reexport safe */ _permissions_js__rspack_import_0.Jj),
133
136
  N3: () => (/* reexport safe */ _permissions_js__rspack_import_0.N3),
@@ -146,8 +149,11 @@ __webpack_require__.d(__webpack_exports__, {
146
149
  Y7: () => (/* reexport safe */ _permissions_js__rspack_import_0.Y7),
147
150
  _X: () => (/* reexport safe */ _permissions_js__rspack_import_0._X),
148
151
  aO: () => (/* reexport safe */ _permissions_js__rspack_import_0.aO),
152
+ aT: () => (/* reexport safe */ _permissions_js__rspack_import_0.aT),
149
153
  fS: () => (/* reexport safe */ _permissions_js__rspack_import_0.fS),
150
154
  hg: () => (/* reexport safe */ _message_keys_js__rspack_import_1.hg),
155
+ kA: () => (/* reexport safe */ _permissions_js__rspack_import_0.kA),
156
+ kd: () => (/* reexport safe */ _permissions_js__rspack_import_0.kd),
151
157
  l3: () => (/* reexport safe */ _permissions_js__rspack_import_0.l3),
152
158
  mK: () => (/* reexport safe */ _message_keys_js__rspack_import_1.mK),
153
159
  mV: () => (/* reexport safe */ _permissions_js__rspack_import_0.mV),
@@ -342,6 +348,35 @@ const FORM_RESULT_PERMISSIONS = {
342
348
  UPDATE: 'form-result.update',
343
349
  DELETE: 'form-result.delete'
344
350
  };
351
+ // ==================== ENTITY BUILDER MODULE ====================
352
+ // Static metadata permissions only. Per-dynamic-entity record permissions
353
+ // (`entity_builder.entity.<entityCode>.<action>`) are checked by flows running as the caller;
354
+ // ENTITY_BUILDER_ALL_DYNAMIC is the wildcard that grants all of them (and nothing else).
355
+ const ENTITY_DEFINITION_PERMISSIONS = {
356
+ CREATE: 'entity_builder.entity_definition.create',
357
+ READ: 'entity_builder.entity_definition.read',
358
+ UPDATE: 'entity_builder.entity_definition.update',
359
+ DELETE: 'entity_builder.entity_definition.delete'
360
+ };
361
+ const FIELD_DEFINITION_PERMISSIONS = {
362
+ READ: 'entity_builder.field_definition.read',
363
+ UPDATE: 'entity_builder.field_definition.update'
364
+ };
365
+ const FLOW_DEFINITION_PERMISSIONS = {
366
+ CREATE: 'entity_builder.flow_definition.create',
367
+ READ: 'entity_builder.flow_definition.read',
368
+ UPDATE: 'entity_builder.flow_definition.update',
369
+ DELETE: 'entity_builder.flow_definition.delete',
370
+ TEST: 'entity_builder.flow_definition.test',
371
+ /** Needed to save a flow that runs as the system (bypassing per-entity permissions). */ SYSTEM: 'entity_builder.flow_definition.system',
372
+ /** Needed to save a flow containing a code node (sandboxed JavaScript). */ CODE: 'entity_builder.flow_definition.code'
373
+ };
374
+ const ENTITY_BUILDER_DYNAMIC_PREFIX = 'entity_builder.entity';
375
+ const ENTITY_BUILDER_ALL_DYNAMIC = {
376
+ ALL: `${ENTITY_BUILDER_DYNAMIC_PREFIX}.*`
377
+ };
378
+ const dynamicEntityPermissionParent = (entityCode)=>`${ENTITY_BUILDER_DYNAMIC_PREFIX}.${entityCode}`;
379
+ const dynamicEntityPermission = (entityCode, action)=>`${dynamicEntityPermissionParent(entityCode)}.${action}`;
345
380
  // ==================== EVENT MANAGER MODULE ====================
346
381
  const EVENT_PERMISSIONS = {
347
382
  CREATE: 'event.create',
@@ -436,6 +471,11 @@ const PERMISSIONS = {
436
471
  // Form Builder
437
472
  FORM: FORM_PERMISSIONS,
438
473
  FORM_RESULT: FORM_RESULT_PERMISSIONS,
474
+ // Entity Builder
475
+ ENTITY_DEFINITION: ENTITY_DEFINITION_PERMISSIONS,
476
+ FIELD_DEFINITION: FIELD_DEFINITION_PERMISSIONS,
477
+ FLOW_DEFINITION: FLOW_DEFINITION_PERMISSIONS,
478
+ ENTITY_BUILDER_ALL_DYNAMIC: ENTITY_BUILDER_ALL_DYNAMIC,
439
479
  // Event Manager
440
480
  EVENT: EVENT_PERMISSIONS,
441
481
  // Notification
@@ -458,7 +498,10 @@ __webpack_require__.d(__webpack_exports__, {
458
498
  }, {
459
499
  BC: USER_PERMISSIONS,
460
500
  Bz: AI_ASSISTANT_PERMISSIONS,
501
+ DP: ENTITY_DEFINITION_PERMISSIONS,
461
502
  Em: STORAGE_CONFIG_PERMISSIONS,
503
+ G0: ENTITY_BUILDER_ALL_DYNAMIC,
504
+ GH: dynamicEntityPermissionParent,
462
505
  GT: FORM_RESULT_PERMISSIONS,
463
506
  Jj: PERMISSIONS,
464
507
  N3: TRANSLATION_KEY_PERMISSIONS,
@@ -476,7 +519,10 @@ __webpack_require__.d(__webpack_exports__, {
476
519
  Y7: ACTION_PERMISSIONS,
477
520
  _X: USER_ACTION_PERMISSIONS,
478
521
  aO: COMPANY_ACTION_PERMISSIONS,
522
+ aT: dynamicEntityPermission,
479
523
  fS: TRANSLATION_PERMISSIONS,
524
+ kA: FIELD_DEFINITION_PERMISSIONS,
525
+ kd: FLOW_DEFINITION_PERMISSIONS,
480
526
  l3: SOCIAL_AUTH_CONFIG_PERMISSIONS,
481
527
  mV: ROLE_PERMISSIONS,
482
528
  rH: NOTIFICATION_PERMISSIONS,
@@ -553,8 +599,6 @@ DeleteEmptyIdFromBodyInterceptor = _ts_decorate([
553
599
  var hybrid_cache_class = __webpack_require__(375);
554
600
  // EXTERNAL MODULE: ./projects/nestjs-shared/src/constants/index.ts
555
601
  var constants = __webpack_require__(43);
556
- // EXTERNAL MODULE: ./projects/nestjs-shared/src/constants/message-keys.ts
557
- var message_keys = __webpack_require__(389);
558
602
  ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interceptors/idempotency.interceptor.ts
559
603
  function idempotency_interceptor_ts_decorate(decorators, target, key, desc) {
560
604
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -611,7 +655,7 @@ class IdempotencyInterceptor {
611
655
  throw new common_.ConflictException({
612
656
  success: false,
613
657
  message: 'Request is already being processed',
614
- messageKey: message_keys/* .SYSTEM_MESSAGES.DUPLICATE_REQUEST */.hg.DUPLICATE_REQUEST
658
+ messageKey: constants/* .SYSTEM_MESSAGES.DUPLICATE_REQUEST */.hg.DUPLICATE_REQUEST
615
659
  });
616
660
  }
617
661
  // Return cached response
@@ -700,26 +744,21 @@ function set_user_field_on_body_interceptor_ts_decorate(decorators, target, key,
700
744
  return c > 3 && r && Object.defineProperty(target, key, r), r;
701
745
  }
702
746
 
703
- /**
704
- * Factory function to create interceptors that set user ID fields on request body
705
- * @param fieldName - The field name to set (e.g., 'createdById', 'updatedById', 'deletedById')
706
- */ function createSetUserFieldInterceptor(fieldName) {
747
+ /** Stamps `fieldName` on the body from the authenticated user; a client-sent value is always dropped. */ function createSetUserFieldInterceptor(fieldName) {
707
748
  let SetUserFieldOnBody = class SetUserFieldOnBody {
708
749
  intercept(context, next) {
709
750
  const request = context.switchToHttp().getRequest();
710
- const user = request?.user;
711
- if (user) {
712
- if (Array.isArray(request.body)) {
713
- request.body = request.body.map((item)=>({
714
- ...item,
715
- [fieldName]: user.id
716
- }));
717
- } else if (typeof request.body === 'object' && request.body !== null) {
718
- request.body = {
719
- ...request.body,
720
- [fieldName]: user.id
721
- };
722
- }
751
+ const userId = request?.user?.id;
752
+ const stamp = (item)=>{
753
+ if (typeof item !== 'object' || item === null || Array.isArray(item)) return item;
754
+ const { [fieldName]: _clientValue, ...rest } = item;
755
+ return userId ? {
756
+ ...rest,
757
+ [fieldName]: userId
758
+ } : rest;
759
+ };
760
+ if (request) {
761
+ request.body = Array.isArray(request.body) ? request.body.map(stamp) : stamp(request.body);
723
762
  }
724
763
  return next.handle();
725
764
  }
@@ -729,9 +768,9 @@ function set_user_field_on_body_interceptor_ts_decorate(decorators, target, key,
729
768
  ], SetUserFieldOnBody);
730
769
  return SetUserFieldOnBody;
731
770
  }
732
- /** Sets createdById field on request body from authenticated user */ const SetCreatedByOnBody = createSetUserFieldInterceptor('createdById');
733
- /** Sets updatedById field on request body from authenticated user */ const SetUpdateByOnBody = createSetUserFieldInterceptor('updatedById');
734
- /** Sets deletedById field on request body from authenticated user */ const SetDeletedByOnBody = createSetUserFieldInterceptor('deletedById');
771
+ const SetCreatedByOnBody = createSetUserFieldInterceptor('createdById');
772
+ const SetUpdateByOnBody = createSetUserFieldInterceptor('updatedById');
773
+ const SetDeletedByOnBody = createSetUserFieldInterceptor('deletedById');
735
774
 
736
775
  // EXTERNAL MODULE: ./projects/nestjs-shared/src/modules/utils/utils.service.ts
737
776
  var utils_service = __webpack_require__(169);
@@ -1,15 +1,19 @@
1
1
  export const __rspack_esm_id = 471;
2
2
  export const __rspack_esm_ids = [471];
3
3
  export const __webpack_modules__ = {
4
- 473(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
4
+ 905(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
5
5
 
6
6
  // EXPORTS
7
7
  __webpack_require__.d(__webpack_exports__, {
8
8
  Fi: () => (/* reexport */ AI_ASSISTANT_AUTH_PROVIDER),
9
9
  Hb: () => (/* reexport */ AI_ASSISTANT_TOOL_PROVIDER),
10
10
  T4: () => (/* reexport */ AI_ASSISTANT_USER_LOOKUP_PROVIDER),
11
+ i1: () => (/* reexport */ COMPANY_ACCESS_RESOLVER),
12
+ Ti: () => (/* reexport */ EMAIL_ADAPTER),
11
13
  LO: () => (/* reexport */ EVENT_MANAGER_ADAPTER),
12
14
  KR: () => (/* reexport */ NOTIFICATION_ADAPTER),
15
+ VG: () => (/* reexport */ PERMISSION_ACTION_REGISTRY),
16
+ jd: () => (/* reexport */ PERMISSION_RESOLVER),
13
17
  kF: () => (/* reexport */ PERMISSION_SYNC_ADAPTER)
14
18
  });
15
19
 
@@ -18,12 +22,24 @@ const AI_ASSISTANT_AUTH_PROVIDER = 'AI_ASSISTANT_AUTH_PROVIDER';
18
22
  const AI_ASSISTANT_TOOL_PROVIDER = 'AI_ASSISTANT_TOOL_PROVIDER';
19
23
  const AI_ASSISTANT_USER_LOOKUP_PROVIDER = 'AI_ASSISTANT_USER_LOOKUP_PROVIDER';
20
24
 
25
+ ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interfaces/company-access-resolver.interface.ts
26
+ const COMPANY_ACCESS_RESOLVER = 'COMPANY_ACCESS_RESOLVER';
27
+
28
+ ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interfaces/email-adapter.interface.ts
29
+ const EMAIL_ADAPTER = 'EMAIL_ADAPTER';
30
+
21
31
  ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interfaces/event-manager-adapter.interface.ts
22
32
  const EVENT_MANAGER_ADAPTER = 'EVENT_MANAGER_ADAPTER';
23
33
 
24
34
  ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interfaces/notification-adapter.interface.ts
25
35
  const NOTIFICATION_ADAPTER = 'NOTIFICATION_ADAPTER';
26
36
 
37
+ ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interfaces/permission-action-registry.interface.ts
38
+ const PERMISSION_ACTION_REGISTRY = 'PERMISSION_ACTION_REGISTRY';
39
+
40
+ ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interfaces/permission-resolver.interface.ts
41
+ const PERMISSION_RESOLVER = 'PERMISSION_RESOLVER';
42
+
27
43
  ;// CONCATENATED MODULE: ./projects/nestjs-shared/src/interfaces/permission-sync-adapter.interface.ts
28
44
  const PERMISSION_SYNC_ADAPTER = 'PERMISSION_SYNC_ADAPTER';
29
45
 
@@ -41,6 +57,11 @@ const PERMISSION_SYNC_ADAPTER = 'PERMISSION_SYNC_ADAPTER';
41
57
 
42
58
 
43
59
 
60
+
61
+
62
+
63
+
64
+
44
65
  },
45
66
 
46
67
  };
@@ -48,10 +69,14 @@ import { __webpack_require__ } from '../runtime.js';
48
69
  var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
49
70
  import * as __rspack_chunk_1 from './index.js';
50
71
  __webpack_require__.C(__rspack_chunk_1);
51
- var __webpack_exports__ = __webpack_exec__(473);var __webpack_exports__AI_ASSISTANT_AUTH_PROVIDER = __webpack_exports__.Fi;
72
+ var __webpack_exports__ = __webpack_exec__(905);var __webpack_exports__AI_ASSISTANT_AUTH_PROVIDER = __webpack_exports__.Fi;
52
73
  var __webpack_exports__AI_ASSISTANT_TOOL_PROVIDER = __webpack_exports__.Hb;
53
74
  var __webpack_exports__AI_ASSISTANT_USER_LOOKUP_PROVIDER = __webpack_exports__.T4;
75
+ var __webpack_exports__COMPANY_ACCESS_RESOLVER = __webpack_exports__.i1;
76
+ var __webpack_exports__EMAIL_ADAPTER = __webpack_exports__.Ti;
54
77
  var __webpack_exports__EVENT_MANAGER_ADAPTER = __webpack_exports__.LO;
55
78
  var __webpack_exports__NOTIFICATION_ADAPTER = __webpack_exports__.KR;
79
+ var __webpack_exports__PERMISSION_ACTION_REGISTRY = __webpack_exports__.VG;
80
+ var __webpack_exports__PERMISSION_RESOLVER = __webpack_exports__.jd;
56
81
  var __webpack_exports__PERMISSION_SYNC_ADAPTER = __webpack_exports__.kF;
57
- export { __webpack_exports__AI_ASSISTANT_AUTH_PROVIDER as AI_ASSISTANT_AUTH_PROVIDER, __webpack_exports__AI_ASSISTANT_TOOL_PROVIDER as AI_ASSISTANT_TOOL_PROVIDER, __webpack_exports__AI_ASSISTANT_USER_LOOKUP_PROVIDER as AI_ASSISTANT_USER_LOOKUP_PROVIDER, __webpack_exports__EVENT_MANAGER_ADAPTER as EVENT_MANAGER_ADAPTER, __webpack_exports__NOTIFICATION_ADAPTER as NOTIFICATION_ADAPTER, __webpack_exports__PERMISSION_SYNC_ADAPTER as PERMISSION_SYNC_ADAPTER };
82
+ export { __webpack_exports__AI_ASSISTANT_AUTH_PROVIDER as AI_ASSISTANT_AUTH_PROVIDER, __webpack_exports__AI_ASSISTANT_TOOL_PROVIDER as AI_ASSISTANT_TOOL_PROVIDER, __webpack_exports__AI_ASSISTANT_USER_LOOKUP_PROVIDER as AI_ASSISTANT_USER_LOOKUP_PROVIDER, __webpack_exports__COMPANY_ACCESS_RESOLVER as COMPANY_ACCESS_RESOLVER, __webpack_exports__EMAIL_ADAPTER as EMAIL_ADAPTER, __webpack_exports__EVENT_MANAGER_ADAPTER as EVENT_MANAGER_ADAPTER, __webpack_exports__NOTIFICATION_ADAPTER as NOTIFICATION_ADAPTER, __webpack_exports__PERMISSION_ACTION_REGISTRY as PERMISSION_ACTION_REGISTRY, __webpack_exports__PERMISSION_RESOLVER as PERMISSION_RESOLVER, __webpack_exports__PERMISSION_SYNC_ADAPTER as PERMISSION_SYNC_ADAPTER };
@@ -2,7 +2,7 @@ export const __rspack_esm_id = 548;
2
2
  export const __rspack_esm_ids = [548];
3
3
  export const __webpack_modules__ = {
4
4
  799(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
5
- /* import */ var _logger_middleware_js__rspack_import_0 = __webpack_require__(419);
5
+ /* import */ var _logger_middleware_js__rspack_import_0 = __webpack_require__(591);
6
6
 
7
7
 
8
8
  __webpack_require__.d(__webpack_exports__, {
@@ -10,6 +10,7 @@ __webpack_require__.d(__webpack_exports__, {
10
10
  F6: () => (/* reexport safe */ _logger_middleware_js__rspack_import_0.F6),
11
11
  RE: () => (/* reexport safe */ _logger_middleware_js__rspack_import_0.RE),
12
12
  V8: () => (/* reexport safe */ _logger_middleware_js__rspack_import_0.V8),
13
+ ZV: () => (/* reexport safe */ _logger_middleware_js__rspack_import_0.ZV),
13
14
  pq: () => (/* reexport safe */ _logger_middleware_js__rspack_import_0.pq),
14
15
  xR: () => (/* reexport safe */ _logger_middleware_js__rspack_import_0.xR)
15
16
  });
@@ -20,7 +21,7 @@ __webpack_require__.d(__webpack_exports__, {
20
21
  };
21
22
  import { __webpack_require__ } from '../runtime.js';
22
23
  var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
23
- import * as __rspack_chunk_1 from '../720.js';
24
+ import * as __rspack_chunk_1 from '../948.js';
24
25
  __webpack_require__.C(__rspack_chunk_1);
25
26
  import * as __rspack_chunk_2 from './index.js';
26
27
  __webpack_require__.C(__rspack_chunk_2);
@@ -30,4 +31,5 @@ var __webpack_exports__getRequestId = __webpack_exports__.RE;
30
31
  var __webpack_exports__getTenantId = __webpack_exports__.EO;
31
32
  var __webpack_exports__getUserId = __webpack_exports__.F6;
32
33
  var __webpack_exports__requestContext = __webpack_exports__.V8;
33
- export { __webpack_exports__LoggerMiddleware as LoggerMiddleware, __webpack_exports__getCompanyId as getCompanyId, __webpack_exports__getRequestId as getRequestId, __webpack_exports__getTenantId as getTenantId, __webpack_exports__getUserId as getUserId, __webpack_exports__requestContext as requestContext };
34
+ var __webpack_exports__setRequestUser = __webpack_exports__.ZV;
35
+ export { __webpack_exports__LoggerMiddleware as LoggerMiddleware, __webpack_exports__getCompanyId as getCompanyId, __webpack_exports__getRequestId as getRequestId, __webpack_exports__getTenantId as getTenantId, __webpack_exports__getUserId as getUserId, __webpack_exports__requestContext as requestContext, __webpack_exports__setRequestUser as setRequestUser };