@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.
- package/CHANGELOG.md +15 -0
- package/README.md +3556 -0
- package/package.json +41 -0
- package/src/index.d.ts +8 -0
- package/src/index.js +15 -0
- package/src/index.js.map +1 -0
- package/src/lib/constants/index.d.ts +14 -0
- package/src/lib/constants/index.js +18 -0
- package/src/lib/constants/index.js.map +1 -0
- package/src/lib/decorators/acl-controller.decorator.d.ts +4 -0
- package/src/lib/decorators/acl-controller.decorator.js +19 -0
- package/src/lib/decorators/acl-controller.decorator.js.map +1 -0
- package/src/lib/decorators/index.d.ts +1 -0
- package/src/lib/decorators/index.js +6 -0
- package/src/lib/decorators/index.js.map +1 -0
- package/src/lib/factories/ability-proxy.factory.d.ts +17 -0
- package/src/lib/factories/ability-proxy.factory.js +100 -0
- package/src/lib/factories/ability-proxy.factory.js.map +1 -0
- package/src/lib/factories/ability.factory.d.ts +49 -0
- package/src/lib/factories/ability.factory.js +235 -0
- package/src/lib/factories/ability.factory.js.map +1 -0
- package/src/lib/factories/index.d.ts +2 -0
- package/src/lib/factories/index.js +6 -0
- package/src/lib/factories/index.js.map +1 -0
- package/src/lib/guards/acl.guard.d.ts +21 -0
- package/src/lib/guards/acl.guard.js +68 -0
- package/src/lib/guards/acl.guard.js.map +1 -0
- package/src/lib/guards/index.d.ts +1 -0
- package/src/lib/guards/index.js +5 -0
- package/src/lib/guards/index.js.map +1 -0
- package/src/lib/nestjs-acl-permissions.module.d.ts +9 -0
- package/src/lib/nestjs-acl-permissions.module.js +56 -0
- package/src/lib/nestjs-acl-permissions.module.js.map +1 -0
- package/src/lib/services/acl-authorization.service.d.ts +10 -0
- package/src/lib/services/acl-authorization.service.js +100 -0
- package/src/lib/services/acl-authorization.service.js.map +1 -0
- package/src/lib/services/index.d.ts +2 -0
- package/src/lib/services/index.js +6 -0
- package/src/lib/services/index.js.map +1 -0
- package/src/lib/services/rule-materializer.service.d.ts +73 -0
- package/src/lib/services/rule-materializer.service.js +251 -0
- package/src/lib/services/rule-materializer.service.js.map +1 -0
- package/src/lib/types/acl-context.types.d.ts +14 -0
- package/src/lib/types/acl-context.types.js +3 -0
- package/src/lib/types/acl-context.types.js.map +1 -0
- package/src/lib/types/acl-options.types.d.ts +97 -0
- package/src/lib/types/acl-options.types.js +3 -0
- package/src/lib/types/acl-options.types.js.map +1 -0
- package/src/lib/types/acl-rules.types.d.ts +201 -0
- package/src/lib/types/acl-rules.types.js +27 -0
- package/src/lib/types/acl-rules.types.js.map +1 -0
- package/src/lib/types/decorator-options.types.d.ts +64 -0
- package/src/lib/types/decorator-options.types.js +3 -0
- package/src/lib/types/decorator-options.types.js.map +1 -0
- package/src/lib/types/index.d.ts +4 -0
- package/src/lib/types/index.js +8 -0
- package/src/lib/types/index.js.map +1 -0
- package/src/lib/utils/index.d.ts +10 -0
- package/src/lib/utils/index.js +53 -0
- package/src/lib/utils/index.js.map +1 -0
- package/src/lib/utils/orm-proxy/extract-field-paths.d.ts +73 -0
- package/src/lib/utils/orm-proxy/extract-field-paths.js +155 -0
- package/src/lib/utils/orm-proxy/extract-field-paths.js.map +1 -0
- package/src/lib/utils/orm-proxy/handle-acl-query-error.d.ts +19 -0
- package/src/lib/utils/orm-proxy/handle-acl-query-error.js +53 -0
- package/src/lib/utils/orm-proxy/handle-acl-query-error.js.map +1 -0
- package/src/lib/utils/orm-proxy/index.d.ts +9 -0
- package/src/lib/utils/orm-proxy/index.js +24 -0
- package/src/lib/utils/orm-proxy/index.js.map +1 -0
- package/src/lib/utils/orm-proxy/merge-query-with-acl-data.d.ts +27 -0
- package/src/lib/utils/orm-proxy/merge-query-with-acl-data.js +78 -0
- package/src/lib/utils/orm-proxy/merge-query-with-acl-data.js.map +1 -0
- package/src/lib/utils/orm-proxy/prepare-acl-query.d.ts +11 -0
- package/src/lib/utils/orm-proxy/prepare-acl-query.js +35 -0
- package/src/lib/utils/orm-proxy/prepare-acl-query.js.map +1 -0
- package/src/lib/utils/orm-proxy/process-item-field-restrictions.d.ts +24 -0
- package/src/lib/utils/orm-proxy/process-item-field-restrictions.js +42 -0
- package/src/lib/utils/orm-proxy/process-item-field-restrictions.js.map +1 -0
- package/src/lib/utils/orm-proxy/remove-acl-added-fields.d.ts +31 -0
- package/src/lib/utils/orm-proxy/remove-acl-added-fields.js +104 -0
- package/src/lib/utils/orm-proxy/remove-acl-added-fields.js.map +1 -0
- package/src/lib/utils/orm-proxy/unset-deep.d.ts +13 -0
- package/src/lib/utils/orm-proxy/unset-deep.js +41 -0
- package/src/lib/utils/orm-proxy/unset-deep.js.map +1 -0
- package/src/lib/utils/orm-proxy/validate-no-current-in-rules.d.ts +19 -0
- package/src/lib/utils/orm-proxy/validate-no-current-in-rules.js +33 -0
- package/src/lib/utils/orm-proxy/validate-no-current-in-rules.js.map +1 -0
- package/src/lib/utils/orm-proxy/validate-rules-for-orm.d.ts +16 -0
- package/src/lib/utils/orm-proxy/validate-rules-for-orm.js +35 -0
- package/src/lib/utils/orm-proxy/validate-rules-for-orm.js.map +1 -0
- package/src/lib/wrappers/index.d.ts +9 -0
- package/src/lib/wrappers/index.js +32 -0
- package/src/lib/wrappers/index.js.map +1 -0
- package/src/lib/wrappers/logger-init.d.ts +2 -0
- package/src/lib/wrappers/logger-init.js +9 -0
- package/src/lib/wrappers/logger-init.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/get-proxy-orm.d.ts +4 -0
- package/src/lib/wrappers/wrapper-json-method-controller/get-proxy-orm.js +47 -0
- package/src/lib/wrappers/wrapper-json-method-controller/get-proxy-orm.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/index.d.ts +3 -0
- package/src/lib/wrappers/wrapper-json-method-controller/index.js +21 -0
- package/src/lib/wrappers/wrapper-json-method-controller/index.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-one-proxy.d.ts +3 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-one-proxy.js +51 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-one-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.d.ts +4 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.js +59 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-all-proxy.d.ts +13 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-all-proxy.js +67 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-all-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-one-proxy.d.ts +12 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-one-proxy.js +50 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-one-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.d.ts +4 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.js +50 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/index.d.ts +9 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/index.js +13 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/index.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-one-proxy.d.ts +3 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-one-proxy.js +132 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-one-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.d.ts +4 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.js +68 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-one-proxy.d.ts +3 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-one-proxy.js +73 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-one-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.d.ts +4 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.js +66 -0
- package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.js.map +1 -0
- package/src/lib/wrappers/wrapper-json-method-controller/on-module-init.d.ts +2 -0
- package/src/lib/wrappers/wrapper-json-method-controller/on-module-init.js +16 -0
- 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,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,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"}
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.d.ts
ADDED
|
@@ -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>;
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/delete-relationship-proxy.js
ADDED
|
@@ -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
|
+
}>;
|