@klerick/acl-json-api-nestjs 0.1.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 (135) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +3556 -0
  3. package/package.json +41 -0
  4. package/src/index.d.ts +8 -0
  5. package/src/index.js +15 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/constants/index.d.ts +14 -0
  8. package/src/lib/constants/index.js +18 -0
  9. package/src/lib/constants/index.js.map +1 -0
  10. package/src/lib/decorators/acl-controller.decorator.d.ts +4 -0
  11. package/src/lib/decorators/acl-controller.decorator.js +19 -0
  12. package/src/lib/decorators/acl-controller.decorator.js.map +1 -0
  13. package/src/lib/decorators/index.d.ts +1 -0
  14. package/src/lib/decorators/index.js +6 -0
  15. package/src/lib/decorators/index.js.map +1 -0
  16. package/src/lib/factories/ability-proxy.factory.d.ts +17 -0
  17. package/src/lib/factories/ability-proxy.factory.js +100 -0
  18. package/src/lib/factories/ability-proxy.factory.js.map +1 -0
  19. package/src/lib/factories/ability.factory.d.ts +49 -0
  20. package/src/lib/factories/ability.factory.js +235 -0
  21. package/src/lib/factories/ability.factory.js.map +1 -0
  22. package/src/lib/factories/index.d.ts +2 -0
  23. package/src/lib/factories/index.js +6 -0
  24. package/src/lib/factories/index.js.map +1 -0
  25. package/src/lib/guards/acl.guard.d.ts +21 -0
  26. package/src/lib/guards/acl.guard.js +68 -0
  27. package/src/lib/guards/acl.guard.js.map +1 -0
  28. package/src/lib/guards/index.d.ts +1 -0
  29. package/src/lib/guards/index.js +5 -0
  30. package/src/lib/guards/index.js.map +1 -0
  31. package/src/lib/nestjs-acl-permissions.module.d.ts +9 -0
  32. package/src/lib/nestjs-acl-permissions.module.js +56 -0
  33. package/src/lib/nestjs-acl-permissions.module.js.map +1 -0
  34. package/src/lib/services/acl-authorization.service.d.ts +10 -0
  35. package/src/lib/services/acl-authorization.service.js +100 -0
  36. package/src/lib/services/acl-authorization.service.js.map +1 -0
  37. package/src/lib/services/index.d.ts +2 -0
  38. package/src/lib/services/index.js +6 -0
  39. package/src/lib/services/index.js.map +1 -0
  40. package/src/lib/services/rule-materializer.service.d.ts +73 -0
  41. package/src/lib/services/rule-materializer.service.js +251 -0
  42. package/src/lib/services/rule-materializer.service.js.map +1 -0
  43. package/src/lib/types/acl-context.types.d.ts +14 -0
  44. package/src/lib/types/acl-context.types.js +3 -0
  45. package/src/lib/types/acl-context.types.js.map +1 -0
  46. package/src/lib/types/acl-options.types.d.ts +97 -0
  47. package/src/lib/types/acl-options.types.js +3 -0
  48. package/src/lib/types/acl-options.types.js.map +1 -0
  49. package/src/lib/types/acl-rules.types.d.ts +201 -0
  50. package/src/lib/types/acl-rules.types.js +27 -0
  51. package/src/lib/types/acl-rules.types.js.map +1 -0
  52. package/src/lib/types/decorator-options.types.d.ts +64 -0
  53. package/src/lib/types/decorator-options.types.js +3 -0
  54. package/src/lib/types/decorator-options.types.js.map +1 -0
  55. package/src/lib/types/index.d.ts +4 -0
  56. package/src/lib/types/index.js +8 -0
  57. package/src/lib/types/index.js.map +1 -0
  58. package/src/lib/utils/index.d.ts +10 -0
  59. package/src/lib/utils/index.js +53 -0
  60. package/src/lib/utils/index.js.map +1 -0
  61. package/src/lib/utils/orm-proxy/extract-field-paths.d.ts +73 -0
  62. package/src/lib/utils/orm-proxy/extract-field-paths.js +155 -0
  63. package/src/lib/utils/orm-proxy/extract-field-paths.js.map +1 -0
  64. package/src/lib/utils/orm-proxy/handle-acl-query-error.d.ts +19 -0
  65. package/src/lib/utils/orm-proxy/handle-acl-query-error.js +53 -0
  66. package/src/lib/utils/orm-proxy/handle-acl-query-error.js.map +1 -0
  67. package/src/lib/utils/orm-proxy/index.d.ts +9 -0
  68. package/src/lib/utils/orm-proxy/index.js +24 -0
  69. package/src/lib/utils/orm-proxy/index.js.map +1 -0
  70. package/src/lib/utils/orm-proxy/merge-query-with-acl-data.d.ts +27 -0
  71. package/src/lib/utils/orm-proxy/merge-query-with-acl-data.js +78 -0
  72. package/src/lib/utils/orm-proxy/merge-query-with-acl-data.js.map +1 -0
  73. package/src/lib/utils/orm-proxy/prepare-acl-query.d.ts +11 -0
  74. package/src/lib/utils/orm-proxy/prepare-acl-query.js +35 -0
  75. package/src/lib/utils/orm-proxy/prepare-acl-query.js.map +1 -0
  76. package/src/lib/utils/orm-proxy/process-item-field-restrictions.d.ts +24 -0
  77. package/src/lib/utils/orm-proxy/process-item-field-restrictions.js +42 -0
  78. package/src/lib/utils/orm-proxy/process-item-field-restrictions.js.map +1 -0
  79. package/src/lib/utils/orm-proxy/remove-acl-added-fields.d.ts +31 -0
  80. package/src/lib/utils/orm-proxy/remove-acl-added-fields.js +104 -0
  81. package/src/lib/utils/orm-proxy/remove-acl-added-fields.js.map +1 -0
  82. package/src/lib/utils/orm-proxy/unset-deep.d.ts +13 -0
  83. package/src/lib/utils/orm-proxy/unset-deep.js +41 -0
  84. package/src/lib/utils/orm-proxy/unset-deep.js.map +1 -0
  85. package/src/lib/utils/orm-proxy/validate-no-current-in-rules.d.ts +19 -0
  86. package/src/lib/utils/orm-proxy/validate-no-current-in-rules.js +33 -0
  87. package/src/lib/utils/orm-proxy/validate-no-current-in-rules.js.map +1 -0
  88. package/src/lib/utils/orm-proxy/validate-rules-for-orm.d.ts +16 -0
  89. package/src/lib/utils/orm-proxy/validate-rules-for-orm.js +35 -0
  90. package/src/lib/utils/orm-proxy/validate-rules-for-orm.js.map +1 -0
  91. package/src/lib/wrappers/index.d.ts +9 -0
  92. package/src/lib/wrappers/index.js +32 -0
  93. package/src/lib/wrappers/index.js.map +1 -0
  94. package/src/lib/wrappers/logger-init.d.ts +2 -0
  95. package/src/lib/wrappers/logger-init.js +9 -0
  96. package/src/lib/wrappers/logger-init.js.map +1 -0
  97. package/src/lib/wrappers/wrapper-json-method-controller/get-proxy-orm.d.ts +4 -0
  98. package/src/lib/wrappers/wrapper-json-method-controller/get-proxy-orm.js +47 -0
  99. package/src/lib/wrappers/wrapper-json-method-controller/get-proxy-orm.js.map +1 -0
  100. package/src/lib/wrappers/wrapper-json-method-controller/index.d.ts +3 -0
  101. package/src/lib/wrappers/wrapper-json-method-controller/index.js +21 -0
  102. package/src/lib/wrappers/wrapper-json-method-controller/index.js.map +1 -0
  103. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-one-proxy.d.ts +3 -0
  104. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-one-proxy.js +51 -0
  105. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-one-proxy.js.map +1 -0
  106. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.d.ts +4 -0
  107. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.js +59 -0
  108. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.js.map +1 -0
  109. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-all-proxy.d.ts +13 -0
  110. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-all-proxy.js +67 -0
  111. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-all-proxy.js.map +1 -0
  112. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-one-proxy.d.ts +12 -0
  113. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-one-proxy.js +50 -0
  114. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-one-proxy.js.map +1 -0
  115. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.d.ts +4 -0
  116. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.js +50 -0
  117. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.js.map +1 -0
  118. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/index.d.ts +9 -0
  119. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/index.js +13 -0
  120. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/index.js.map +1 -0
  121. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-one-proxy.d.ts +3 -0
  122. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-one-proxy.js +132 -0
  123. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-one-proxy.js.map +1 -0
  124. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.d.ts +4 -0
  125. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.js +68 -0
  126. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.js.map +1 -0
  127. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-one-proxy.d.ts +3 -0
  128. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-one-proxy.js +73 -0
  129. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-one-proxy.js.map +1 -0
  130. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.d.ts +4 -0
  131. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.js +66 -0
  132. package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.js.map +1 -0
  133. package/src/lib/wrappers/wrapper-json-method-controller/on-module-init.d.ts +2 -0
  134. package/src/lib/wrappers/wrapper-json-method-controller/on-module-init.js +16 -0
  135. package/src/lib/wrappers/wrapper-json-method-controller/on-module-init.js.map +1 -0
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.removeAclAddedFields = removeAclAddedFields;
4
+ const unset_deep_1 = require("./unset-deep");
5
+ /**
6
+ * Removes ACL-added fields and relations from item that were not requested by user
7
+ *
8
+ * IMPORTANT: Must match the logic of mergeQueryWithAclData!
9
+ * Only removes fields/relations that were ACTUALLY ADDED by mergeQueryWithAclData.
10
+ *
11
+ * mergeQueryWithAclData adds ACL fields ONLY when userFields[relation] is an array.
12
+ * It does NOT add when: null, undefined, {}, missing key, or relation: null.
13
+ *
14
+ * @param item - Entity item to clean
15
+ * @param userFields - Fields requested by user (query.fields)
16
+ * @param aclFields - Fields added by ACL (aclQueryData.fields)
17
+ * @param userInclude - Relations requested by user (query.include)
18
+ * @param aclInclude - Relations added by ACL (aclQueryData.include)
19
+ *
20
+ * @example
21
+ * // Case 1: userFields: null → ACL didn't add fields, don't remove
22
+ * removeAclAddedFields(item, null, { target: ['role'] })
23
+ * // → nothing removed (null = all fields requested)
24
+ *
25
+ * // Case 2: userFields: { target: ['id'] } → ACL added 'role', remove it
26
+ * removeAclAddedFields(item, { target: ['id'] }, { target: ['role'] })
27
+ * // → removes 'role' from item
28
+ *
29
+ * // Case 3: ACL added include → remove entire relation
30
+ * removeAclAddedFields(item, null, null, [], ['profile'])
31
+ * // → removes profile relation (not requested by user)
32
+ */
33
+ function removeAclAddedFields(item, userFields, aclFields, userInclude, aclInclude) {
34
+ // Remove relations added by ACL include (independent of fields logic)
35
+ if (aclInclude &&
36
+ 'length' in aclInclude &&
37
+ parseInt(`${aclInclude.length}`) > 0) {
38
+ const userIncludeArray = (Array.isArray(userInclude) ? userInclude : []);
39
+ const aclIncludeArray = (Array.isArray(aclInclude) ? aclInclude : []);
40
+ for (const relation of aclIncludeArray) {
41
+ // If relation was added by ACL (not in user include), remove it
42
+ if (!userIncludeArray.includes(relation)) {
43
+ delete item[relation];
44
+ }
45
+ }
46
+ }
47
+ if (!aclFields) {
48
+ return;
49
+ }
50
+ // CASE 1: userFields === null → all fields requested, ACL didn't add field-level data
51
+ if (userFields === null) {
52
+ return; // Don't remove fields (but relations already removed above)
53
+ }
54
+ // CASE 2: userFields === undefined → all fields requested
55
+ if (userFields === undefined) {
56
+ return; // Don't remove fields
57
+ }
58
+ // CASE 3: userFields === {} → all fields requested
59
+ if (typeof userFields === 'object' && Object.keys(userFields).length === 0) {
60
+ return; // Don't remove fields
61
+ }
62
+ // CASE 4: userFields is object with keys
63
+ for (const [relation, aclFieldsArray] of Object.entries(aclFields)) {
64
+ if (!Array.isArray(aclFieldsArray))
65
+ continue;
66
+ const userFieldsArray = userFields[relation];
67
+ // Sub-case 1: relation key missing → all fields for this relation requested
68
+ if (userFieldsArray === undefined) {
69
+ continue; // ACL didn't add fields, don't remove
70
+ }
71
+ // Sub-case 2: relation: null → all fields for this relation requested
72
+ if (userFieldsArray === null) {
73
+ continue; // ACL didn't add fields, don't remove
74
+ }
75
+ // Sub-case 3: relation is array → ACL MAY have added fields, check and remove
76
+ if (Array.isArray(userFieldsArray)) {
77
+ for (const field of aclFieldsArray) {
78
+ if (!userFieldsArray.includes(field)) {
79
+ // This field was added by ACL - remove it
80
+ if (relation === 'target') {
81
+ (0, unset_deep_1.unsetDeep)(item, field);
82
+ }
83
+ else {
84
+ // Check if relation is an array (one-to-many)
85
+ const relationValue = item[relation];
86
+ if (Array.isArray(relationValue)) {
87
+ // Remove field from each element in the array
88
+ for (const element of relationValue) {
89
+ if (typeof element === 'object' && element !== null) {
90
+ (0, unset_deep_1.unsetDeep)(element, field);
91
+ }
92
+ }
93
+ }
94
+ else {
95
+ // Single object (one-to-one) - remove nested field
96
+ (0, unset_deep_1.unsetDeep)(item, `${relation}.${field}`);
97
+ }
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=remove-acl-added-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-acl-added-fields.js","sourceRoot":"","sources":["../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/utils/orm-proxy/remove-acl-added-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Removes a property from an object using dot notation path
3
+ * Similar to lodash.unset()
4
+ *
5
+ * @example
6
+ * const obj = { a: { b: { c: 1 } } };
7
+ * unsetDeep(obj, 'a.b.c');
8
+ * // obj = { a: { b: {} } }
9
+ *
10
+ * @param obj - The object to modify
11
+ * @param path - The path of the property to unset (e.g., 'profile.phone')
12
+ */
13
+ export declare function unsetDeep<T extends object>(obj: T, path: string): void;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unsetDeep = unsetDeep;
4
+ /**
5
+ * Removes a property from an object using dot notation path
6
+ * Similar to lodash.unset()
7
+ *
8
+ * @example
9
+ * const obj = { a: { b: { c: 1 } } };
10
+ * unsetDeep(obj, 'a.b.c');
11
+ * // obj = { a: { b: {} } }
12
+ *
13
+ * @param obj - The object to modify
14
+ * @param path - The path of the property to unset (e.g., 'profile.phone')
15
+ */
16
+ function unsetDeep(obj, path) {
17
+ if (!obj || typeof obj !== 'object') {
18
+ return;
19
+ }
20
+ const keys = path.split('.');
21
+ // Navigate to parent object
22
+ let current = obj;
23
+ for (let i = 0; i < keys.length - 1; i++) {
24
+ const key = keys[i];
25
+ if (current[key] === null || current[key] === undefined) {
26
+ // Path doesn't exist, nothing to unset
27
+ return;
28
+ }
29
+ if (typeof current[key] !== 'object') {
30
+ // Path is invalid (trying to access property of primitive)
31
+ return;
32
+ }
33
+ current = current[key];
34
+ }
35
+ // Delete the final property
36
+ const lastKey = keys[keys.length - 1];
37
+ if (current && typeof current === 'object' && lastKey in current) {
38
+ delete current[lastKey];
39
+ }
40
+ }
41
+ //# sourceMappingURL=unset-deep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unset-deep.js","sourceRoot":"","sources":["../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/utils/orm-proxy/unset-deep.ts"],"names":[],"mappings":";;AAYA,8BA8BC;AA1CD;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CAAmB,GAAM,EAAE,IAAY;IAC9D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE7B,4BAA4B;IAC5B,IAAI,OAAO,GAAQ,GAAG,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACxD,uCAAuC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YACrC,2DAA2D;YAC3D,OAAO;QACT,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACjE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { ExtendAbility } from '../../factories';
2
+ /**
3
+ * Validates that ACL rules don't contain __current field references
4
+ *
5
+ * The __current field is only supported in operations that compare old vs new values:
6
+ * - patchOne
7
+ * - patchRelationship
8
+ *
9
+ * Other operations (getAll, getOne, postOne, deleteOne, etc.) should not use __current
10
+ * as there is no "old value" to compare against.
11
+ *
12
+ * Uses fast string search to check for __current references in rule conditions.
13
+ * Throws on first found __current reference (fail-fast approach)
14
+ *
15
+ * @param ability - ExtendAbility instance to validate
16
+ * @param context - Context name for error message (e.g., 'getOneProxy', 'postOneProxy')
17
+ * @throws Error if __current is found in rules
18
+ */
19
+ export declare function validateNoCurrentInRules(ability: ExtendAbility, context: string): void;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateNoCurrentInRules = validateNoCurrentInRules;
4
+ const handle_acl_query_error_1 = require("./handle-acl-query-error");
5
+ /**
6
+ * Validates that ACL rules don't contain __current field references
7
+ *
8
+ * The __current field is only supported in operations that compare old vs new values:
9
+ * - patchOne
10
+ * - patchRelationship
11
+ *
12
+ * Other operations (getAll, getOne, postOne, deleteOne, etc.) should not use __current
13
+ * as there is no "old value" to compare against.
14
+ *
15
+ * Uses fast string search to check for __current references in rule conditions.
16
+ * Throws on first found __current reference (fail-fast approach)
17
+ *
18
+ * @param ability - ExtendAbility instance to validate
19
+ * @param context - Context name for error message (e.g., 'getOneProxy', 'postOneProxy')
20
+ * @throws Error if __current is found in rules
21
+ */
22
+ function validateNoCurrentInRules(ability, context) {
23
+ // Fast check: convert to JSON and search for __current references
24
+ const rulesJson = JSON.stringify(ability.rules);
25
+ // Search for __current as field reference: "__current"
26
+ if (rulesJson.includes('"__current')) {
27
+ const error = new Error(`Field __current is not supported in ${ability.action} operation. ` +
28
+ `__current is only available in patchOne and patchRelationship operations ` +
29
+ `where old and new values need to be compared.`);
30
+ throw (0, handle_acl_query_error_1.handleAclQueryError)(error, ability.subject, context);
31
+ }
32
+ }
33
+ //# sourceMappingURL=validate-no-current-in-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-no-current-in-rules.js","sourceRoot":"","sources":["../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/utils/orm-proxy/validate-no-current-in-rules.ts"],"names":[],"mappings":";;AAoBA,4DAgBC;AAnCD,qEAA+D;AAE/D;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,wBAAwB,CACtC,OAAsB,EACtB,OAAe;IAEf,kEAAkE;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEhD,uDAAuD;IACvD,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,uCAAuC,OAAO,CAAC,MAAM,cAAc;YACjE,2EAA2E;YAC3E,+CAA+C,CAClD,CAAC;QACF,MAAM,IAAA,4CAAmB,EAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { ExtendAbility } from '../../factories';
2
+ /**
3
+ * Validates that ACL rules don't contain operators unsupported by MikroORM
4
+ *
5
+ * Uses fast string search to check for unsupported operators:
6
+ * - $size: array size check
7
+ * - $elemMatch: array element matching
8
+ * - $options: regex options
9
+ * - $where: JavaScript function execution
10
+ *
11
+ * Throws on first found unsupported operator (fail-fast approach)
12
+ *
13
+ * @param ability - ExtendAbility instance to validate
14
+ * @throws Error if any unsupported operator is found
15
+ */
16
+ export declare function validateRulesForORM(ability: ExtendAbility): void;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateRulesForORM = validateRulesForORM;
4
+ const handle_acl_query_error_1 = require("./handle-acl-query-error");
5
+ /**
6
+ * Unsupported operators in MikroORM that exist in CASL
7
+ */
8
+ const UNSUPPORTED_OPERATORS = ['$size', '$elemMatch', '$options', '$where'];
9
+ /**
10
+ * Validates that ACL rules don't contain operators unsupported by MikroORM
11
+ *
12
+ * Uses fast string search to check for unsupported operators:
13
+ * - $size: array size check
14
+ * - $elemMatch: array element matching
15
+ * - $options: regex options
16
+ * - $where: JavaScript function execution
17
+ *
18
+ * Throws on first found unsupported operator (fail-fast approach)
19
+ *
20
+ * @param ability - ExtendAbility instance to validate
21
+ * @throws Error if any unsupported operator is found
22
+ */
23
+ function validateRulesForORM(ability) {
24
+ // Fast check: convert to JSON and search for operator keys
25
+ const rulesJson = JSON.stringify(ability.rules);
26
+ for (const operator of UNSUPPORTED_OPERATORS) {
27
+ // Search for operator as JSON key: "$operator"
28
+ if (rulesJson.includes(`"${operator}"`)) {
29
+ const error = new Error(`Unsupported operator: ${operator}. ` +
30
+ `Supported operators: $eq, $ne, $lt, $lte, $gt, $gte, $in, $nin, $and, $or, $not, $exists, $all, $regex, $nor. `);
31
+ throw (0, handle_acl_query_error_1.handleAclQueryError)(error, ability.subject, 'validateRulesForMikroORM');
32
+ }
33
+ }
34
+ }
35
+ //# sourceMappingURL=validate-rules-for-orm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-rules-for-orm.js","sourceRoot":"","sources":["../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/utils/orm-proxy/validate-rules-for-orm.ts"],"names":[],"mappings":";;AAsBA,kDAcC;AAnCD,qEAA+D;AAE/D;;GAEG;AACH,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAE5E;;;;;;;;;;;;;GAaG;AACH,SAAgB,mBAAmB,CAAC,OAAsB;IACxD,2DAA2D;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEhD,KAAK,MAAM,QAAQ,IAAI,qBAAqB,EAAE,CAAC;QAC7C,+CAA+C;QAC/C,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,GAAI,IAAI,KAAK,CACtB,yBAAyB,QAAQ,IAAI;gBACrC,gHAAgH,CACjH,CAAC;YACF,MAAM,IAAA,4CAAmB,EAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { JsonBaseController, OrmService } from '@klerick/json-api-nestjs';
3
+ import { ModuleRef } from '@nestjs/core';
4
+ import { MODULE_REF_PROPS, ORIGINAL_ORM_SERVICE } from '../constants';
5
+ export type WrapperJsonApiController<E extends object> = JsonBaseController<E, 'id'> & {
6
+ [MODULE_REF_PROPS]: ModuleRef;
7
+ [ORIGINAL_ORM_SERVICE]: OrmService<E, 'id'>;
8
+ };
9
+ export declare function wrapperJsonApiController(controllerClass: Type<any>): void;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapperJsonApiController = wrapperJsonApiController;
4
+ const common_1 = require("@nestjs/common");
5
+ const json_api_nestjs_1 = require("@klerick/json-api-nestjs");
6
+ const constants_1 = require("@nestjs/common/constants");
7
+ const constants_2 = require("../constants");
8
+ const guards_1 = require("../guards");
9
+ const logger_init_1 = require("./logger-init");
10
+ const wrapper_json_method_controller_1 = require("./wrapper-json-method-controller");
11
+ function wrapperJsonApiController(controllerClass) {
12
+ const entity = (0, json_api_nestjs_1.entityForClass)(controllerClass);
13
+ if (!entity)
14
+ return;
15
+ const existingMetadata = Reflect.getMetadata(constants_2.ACL_CONTROLLER_METADATA, controllerClass);
16
+ if (!existingMetadata) {
17
+ const metadata = {
18
+ subject: entity,
19
+ methods: {},
20
+ enabled: true,
21
+ };
22
+ Reflect.defineMetadata(constants_2.ACL_CONTROLLER_METADATA, metadata, controllerClass);
23
+ }
24
+ const existingGuard = Reflect.getMetadata(constants_1.GUARDS_METADATA, controllerClass) || [];
25
+ const hasPermissionInterceptor = existingGuard.some((guard) => guard === guards_1.AclGuard || guard?.metatype === guards_1.AclGuard);
26
+ if (!hasPermissionInterceptor) {
27
+ (0, common_1.UseGuards)(guards_1.AclGuard)(controllerClass);
28
+ }
29
+ (0, wrapper_json_method_controller_1.wrapperJsonMethodController)(controllerClass);
30
+ logger_init_1.loggerWrapper.debug(`Add ACL to "${controllerClass.name}" has been added`);
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/index.ts"],"names":[],"mappings":";;AAoBA,4DAkCC;AAtDD,2CAAiD;AACjD,8DAA0F;AAC1F,wDAA2D;AAE3D,4CAIsB;AAEtB,sCAAqC;AACrC,+CAA8C;AAC9C,qFAA+E;AAQ/E,SAAgB,wBAAwB,CAAC,eAA0B;IAEjE,MAAM,MAAM,GAAG,IAAA,gCAAc,EAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAC1C,mCAAuB,EACvB,eAAe,CACqB,CAAC;IACvC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,QAAQ,GAA0B;YACtC,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,IAAI;SACd,CAAC;QACF,OAAO,CAAC,cAAc,CAAC,mCAAuB,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,aAAa,GACjB,OAAO,CAAC,WAAW,CAAC,2BAAe,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IAE9D,MAAM,wBAAwB,GAAG,aAAa,CAAC,IAAI,CACjD,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,KAAK,iBAAQ,IAAI,KAAK,EAAE,QAAQ,KAAK,iBAAQ,CACnE,CAAC;IAEF,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9B,IAAA,kBAAS,EAAC,iBAAQ,CAAC,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,IAAA,4DAA2B,EAAC,eAAe,CAAC,CAAA;IAE5C,2BAAa,CAAC,KAAK,CACjB,eAAe,eAAe,CAAC,IAAI,kBAAkB,CACtD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Logger } from '@nestjs/common';
2
+ export declare const loggerWrapper: Logger;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loggerWrapper = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ if (process.env['USE_ATTACH_BUFFER']) {
6
+ common_1.Logger.attachBuffer();
7
+ }
8
+ exports.loggerWrapper = new common_1.Logger('ACL init');
9
+ //# sourceMappingURL=logger-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-init.js","sourceRoot":"","sources":["../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/logger-init.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAC,CAAC;IACpC,eAAM,CAAC,YAAY,EAAE,CAAA;AACvB,CAAC;AAEY,QAAA,aAAa,GAAG,IAAI,eAAM,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { OrmService } from '@klerick/json-api-nestjs';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import type { AclControllerMetadata } from '../../types';
4
+ export declare function getProxyOrm<E extends object, IdKey extends string>(ormService: OrmService<E, IdKey>, moduleRef: ModuleRef, metadata?: AclControllerMetadata): OrmService<E, IdKey>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getProxyOrm = getProxyOrm;
4
+ const method_proxy_1 = require("./method-proxy");
5
+ function getProxyOrm(ormService, moduleRef, metadata) {
6
+ return new Proxy(ormService, {
7
+ get(target, prop) {
8
+ // Fast path: if method is explicitly disabled, return original method
9
+ // This avoids proxy overhead when ACL is turned off for specific methods
10
+ if (metadata?.methods?.[prop] === false) {
11
+ return target[prop].bind(target);
12
+ }
13
+ switch (prop) {
14
+ case 'getAll':
15
+ return (0, method_proxy_1.getAllProxy)(moduleRef).bind(target);
16
+ case 'getOne':
17
+ return (0, method_proxy_1.getOneProxy)(moduleRef).bind(target);
18
+ case 'patchOne':
19
+ return (0, method_proxy_1.patchOneProxy)(moduleRef).bind(target);
20
+ case 'postOne':
21
+ return (0, method_proxy_1.postOneProxy)(moduleRef).bind(target);
22
+ case 'deleteOne':
23
+ return (0, method_proxy_1.deleteOneProxy)(moduleRef).bind(target);
24
+ case 'getRelationship':
25
+ return (0, method_proxy_1.getRelationshipProxy)(moduleRef).bind(target);
26
+ case 'postRelationship':
27
+ return (0, method_proxy_1.postRelationshipProxy)(moduleRef).bind(target);
28
+ case 'patchRelationship':
29
+ return (0, method_proxy_1.patchRelationshipProxy)(moduleRef).bind(target);
30
+ case 'deleteRelationship':
31
+ return (0, method_proxy_1.deleteRelationshipProxy)(moduleRef).bind(target);
32
+ default:
33
+ return target[prop].bind(target);
34
+ }
35
+ },
36
+ has(target, prop) {
37
+ return Reflect.has(target, prop);
38
+ },
39
+ ownKeys(target) {
40
+ return Reflect.ownKeys(target);
41
+ },
42
+ getOwnPropertyDescriptor(target, prop) {
43
+ return Reflect.getOwnPropertyDescriptor(target, prop);
44
+ },
45
+ });
46
+ }
47
+ //# sourceMappingURL=get-proxy-orm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-proxy-orm.js","sourceRoot":"","sources":["../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/get-proxy-orm.ts"],"names":[],"mappings":";;AAgBA,kCA8CC;AA3DD,iDAUwB;AAGxB,SAAgB,WAAW,CACzB,UAAgC,EAChC,SAAoB,EACpB,QAAgC;IAEhC,OAAO,IAAI,KAAK,CAAC,UAAU,EAAE;QAC3B,GAAG,CAAC,MAAM,EAAE,IAAgC;YAC1C,sEAAsE;YACtE,yEAAyE;YACzE,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAc,CAAC,KAAK,KAAK,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YAED,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,QAAQ;oBACX,OAAO,IAAA,0BAAW,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvD,KAAK,QAAQ;oBACX,OAAO,IAAA,0BAAW,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvD,KAAK,UAAU;oBACb,OAAO,IAAA,4BAAa,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzD,KAAK,SAAS;oBACZ,OAAO,IAAA,2BAAY,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxD,KAAK,WAAW;oBACd,OAAO,IAAA,6BAAc,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1D,KAAK,iBAAiB;oBACpB,OAAO,IAAA,mCAAoB,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChE,KAAK,kBAAkB;oBACrB,OAAO,IAAA,oCAAqB,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACjE,KAAK,mBAAmB;oBACtB,OAAO,IAAA,qCAAsB,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClE,KAAK,oBAAoB;oBACvB,OAAO,IAAA,sCAAuB,EAAW,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnE;oBACE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,MAAM;YACZ,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,wBAAwB,CAAC,MAAM,EAAE,IAAI;YACnC,OAAO,OAAO,CAAC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { JsonBaseController } from '@klerick/json-api-nestjs';
3
+ export declare function wrapperJsonMethodController<E extends object>(controllerClass: Type<JsonBaseController<E, 'id'>>): void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wrapperJsonMethodController = wrapperJsonMethodController;
4
+ const common_1 = require("@nestjs/common");
5
+ const core_1 = require("@nestjs/core");
6
+ const constants_1 = require("../../constants");
7
+ const on_module_init_1 = require("./on-module-init");
8
+ function wrapperJsonMethodController(controllerClass) {
9
+ if (!controllerClass.prototype['onModuleInit']) {
10
+ controllerClass.prototype['onModuleInit'] = on_module_init_1.onModuleInit;
11
+ }
12
+ else {
13
+ const saveInit = controllerClass.prototype['onModuleInit'];
14
+ controllerClass.prototype['onModuleInit'] = function () {
15
+ saveInit.call(this);
16
+ on_module_init_1.onModuleInit.call(this);
17
+ };
18
+ }
19
+ (0, common_1.Inject)(core_1.ModuleRef)(controllerClass.prototype, constants_1.MODULE_REF_PROPS);
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/index.ts"],"names":[],"mappings":";;AAQA,kEAeC;AAvBD,2CAA8C;AAI9C,uCAAyC;AACzC,+CAAmD;AACnD,qDAAgD;AAEhD,SAAgB,2BAA2B,CACzC,eAAkD;IAGlD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/C,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,6BAAY,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC3D,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG;YAC1C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,6BAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAA;IACH,CAAC;IAED,IAAA,eAAM,EAAC,gBAAS,CAAC,CAAC,eAAe,CAAC,SAAS,EAAE,4BAAgB,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ModuleRef } from '@nestjs/core';
2
+ import { OrmService } from '@klerick/json-api-nestjs';
3
+ export declare function deleteOneProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): (this: OrmService<E, IdKey>, id: Parameters<OrmService<E, IdKey>["deleteOne"]>[0]) => Promise<void>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteOneProxy = deleteOneProxy;
4
+ const factories_1 = require("../../../factories");
5
+ const utils_1 = require("../../../utils");
6
+ const common_1 = require("@nestjs/common");
7
+ const ability_1 = require("@casl/ability");
8
+ function deleteOneProxy(moduleRef) {
9
+ return async function deleteOneBind(id) {
10
+ const extendAbility = moduleRef.get(factories_1.ExtendAbility, { strict: false });
11
+ const aclPrepared = (0, utils_1.prepareAclQuery)(extendAbility, {
12
+ include: [],
13
+ fields: null,
14
+ }, false);
15
+ if (!aclPrepared) {
16
+ return this.deleteOne(id);
17
+ }
18
+ (0, utils_1.validateNoCurrentInRules)(extendAbility, 'deleteOneProxy');
19
+ const { mergedQuery, } = aclPrepared;
20
+ // Fetch entity with ACL conditions - handle errors from invalid ACL rules
21
+ let result;
22
+ try {
23
+ result = await this.getOne(id, {
24
+ fields: null,
25
+ include: mergedQuery.include,
26
+ }, false, undefined);
27
+ }
28
+ catch (error) {
29
+ throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'deleteOneProxy');
30
+ }
31
+ const resultItem = result;
32
+ extendAbility.updateWithInput(resultItem);
33
+ if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, resultItem))) {
34
+ common_1.Logger.debug(`Access denied for (action: ${extendAbility.action}, subject: ${extendAbility.subject})`, 'deleteOneProxy', {
35
+ subject: resultItem,
36
+ rules: extendAbility.rules,
37
+ });
38
+ throw new common_1.ForbiddenException([
39
+ {
40
+ code: 'forbidden',
41
+ message: `not allow "${extendAbility.action}"`,
42
+ path: ['action'],
43
+ },
44
+ ], {
45
+ description: `Access denied for ${extendAbility.action} on ${extendAbility.subject}`,
46
+ });
47
+ }
48
+ return this.deleteOne(id);
49
+ };
50
+ }
51
+ //# sourceMappingURL=delete-one-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-one-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-one-proxy.ts"],"names":[],"mappings":";;AAWA,wCA4EC;AArFD,kDAAmD;AACnD,0CAIwB;AACxB,2CAA4D;AAC5D,2CAAwC;AAExC,SAAgB,cAAc,CAC5B,SAAoB;IAEpB,OAAO,KAAK,UAAU,aAAa,CAEjC,EAAoD;QAEpD,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,yBAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtE,MAAM,WAAW,GAAG,IAAA,uBAAe,EACjC,aAAa,EACb;YACE,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,IAAI;SACb,EACA,KAAK,CACP,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,IAAA,gCAAwB,EAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAE1D,MAAM,EACJ,WAAW,GACZ,GAAG,WAAW,CAAC;QAEhB,0EAA0E;QAC1E,IAAI,MAA2D,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CACxB,EAAE,EACF;gBACE,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B,EACD,KAAK,EACL,SAAS,CACV,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,2BAAmB,EAAC,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,UAAU,GAAG,MAAW,CAAC;QAC/B,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1C,IACE,CAAC,aAAa,CAAC,GAAG,CAChB,aAAa,CAAC,MAAM,EACpB,IAAA,iBAAO,EAAC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAC3C,EACD,CAAC;YACD,eAAM,CAAC,KAAK,CACV,8BAA8B,aAAa,CAAC,MAAM,cAAc,aAAa,CAAC,OAAO,GAAG,EACxF,gBAAgB,EAChB;gBACE,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,aAAa,CAAC,KAAK;aAC3B,CACF,CAAC;YACF,MAAM,IAAI,2BAAkB,CAC1B;gBACE;oBACE,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,cAAc,aAAa,CAAC,MAAM,GAAG;oBAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC;iBACjB;aACF,EACD;gBACE,WAAW,EAAE,qBAAqB,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,OAAO,EAAE;aACrF,CACF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { OrmService, PostRelationshipData } from '@klerick/json-api-nestjs';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import { RelationKeys } from '@klerick/json-api-nestjs-shared';
4
+ export declare function deleteRelationshipProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): <Rel extends RelationKeys<E, IdKey>>(this: OrmService<E, IdKey>, id: IdKey, rel: Rel, input: PostRelationshipData) => Promise<void>;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteRelationshipProxy = deleteRelationshipProxy;
4
+ const factories_1 = require("../../../factories");
5
+ const utils_1 = require("../../../utils");
6
+ const ability_1 = require("@casl/ability");
7
+ const common_1 = require("@nestjs/common");
8
+ function deleteRelationshipProxy(moduleRef) {
9
+ return async function deleteRelationshipBind(id, rel, input) {
10
+ const extendAbility = moduleRef.get(factories_1.ExtendAbility, { strict: false });
11
+ const aclPrepared = (0, utils_1.prepareAclQuery)(extendAbility, {
12
+ include: [rel],
13
+ fields: null,
14
+ }, false);
15
+ if (!aclPrepared) {
16
+ return this.deleteRelationship(id, rel, input);
17
+ }
18
+ (0, utils_1.validateNoCurrentInRules)(extendAbility, 'deleteRelationshipProxy');
19
+ const { mergedQuery } = aclPrepared;
20
+ let result;
21
+ try {
22
+ result = await this.getOne(id, {
23
+ fields: null,
24
+ include: mergedQuery.include,
25
+ }, false, undefined);
26
+ }
27
+ catch (error) {
28
+ throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'deleteRelationshipProxy');
29
+ }
30
+ const resultItem = result;
31
+ // Filter relationship to only items being deleted from input.data
32
+ const idsToDelete = new Set(Array.isArray(input)
33
+ ? input.map((item) => item.id)
34
+ : [input.id]);
35
+ // For to-many relationships, filter to only items being deleted
36
+ // For to-one relationships, keep as is
37
+ if (Array.isArray(resultItem[rel])) {
38
+ resultItem[rel] = resultItem[rel].filter((item) => idsToDelete.has(item.id));
39
+ }
40
+ extendAbility.updateWithInput(resultItem);
41
+ if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, resultItem), rel.toString())) {
42
+ common_1.Logger.debug(`Access denied for (action: ${extendAbility.action}, subject: ${extendAbility.subject}), field ${rel.toString()}`, 'deleteRelationshipProxy', {
43
+ subject: resultItem,
44
+ rules: extendAbility.rules,
45
+ });
46
+ throw new common_1.ForbiddenException([
47
+ {
48
+ code: 'forbidden',
49
+ message: `not allow "${extendAbility.action}"`,
50
+ path: ['action'],
51
+ },
52
+ ], {
53
+ description: `Access denied for ${extendAbility.action} on ${extendAbility.subject}`,
54
+ });
55
+ }
56
+ return this.deleteRelationship(id, rel, input);
57
+ };
58
+ }
59
+ //# sourceMappingURL=delete-relationship-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-relationship-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { OrmService } from '@klerick/json-api-nestjs';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ export declare function getAllProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): (this: OrmService<E, IdKey>, query: Parameters<OrmService<E, IdKey>["getAll"]>[0]) => Promise<import("dist/libs/json-api/json-api-nestjs-shared/cjs/src").ResourceObject<E, "array", null, IdKey> | {
4
+ totalItems: number;
5
+ items: E[];
6
+ } | {
7
+ meta: {
8
+ totalItems: number;
9
+ pageNumber: number;
10
+ pageSize: number;
11
+ };
12
+ data: never[];
13
+ }>;