@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,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAllProxy = getAllProxy;
|
|
4
|
+
const json_api_nestjs_1 = require("@klerick/json-api-nestjs");
|
|
5
|
+
const factories_1 = require("../../../factories");
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
function getAllProxy(moduleRef) {
|
|
8
|
+
return async function getAllBind(query) {
|
|
9
|
+
const extendAbility = moduleRef.get(factories_1.ExtendAbility, { strict: false });
|
|
10
|
+
const aclPrepared = (0, utils_1.prepareAclQuery)(extendAbility, query);
|
|
11
|
+
if (!aclPrepared) {
|
|
12
|
+
return this.getAll(query);
|
|
13
|
+
}
|
|
14
|
+
(0, utils_1.validateNoCurrentInRules)(extendAbility, 'getAllProxy');
|
|
15
|
+
const { transformToJsonApi, aclQueryData, mergedQuery } = aclPrepared;
|
|
16
|
+
// Fetch entity with ACL conditions - handle errors from invalid ACL rules
|
|
17
|
+
let result;
|
|
18
|
+
try {
|
|
19
|
+
result = await this.getAll(mergedQuery, transformToJsonApi, aclQueryData?.rulesForQuery);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'getAllProxy');
|
|
23
|
+
}
|
|
24
|
+
// If already transformed by ORM, return as is
|
|
25
|
+
if (transformToJsonApi) {
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
// Manual transformation with field filtering
|
|
29
|
+
const { totalItems, items } = result;
|
|
30
|
+
const { page } = query;
|
|
31
|
+
// Build meta
|
|
32
|
+
const meta = {
|
|
33
|
+
totalItems,
|
|
34
|
+
pageNumber: page.number,
|
|
35
|
+
pageSize: page.size,
|
|
36
|
+
};
|
|
37
|
+
// If empty, return immediately
|
|
38
|
+
if (totalItems === 0 || items.length === 0) {
|
|
39
|
+
return { meta, data: [] };
|
|
40
|
+
}
|
|
41
|
+
const fieldsForCheck = (0, utils_1.extractFieldsForCheck)(moduleRef, items[0], query, aclQueryData);
|
|
42
|
+
const { entityParamMap } = (0, utils_1.getCurrentEntityAndParamMap)(moduleRef);
|
|
43
|
+
// Field filtering logic
|
|
44
|
+
const fieldRestrictions = [];
|
|
45
|
+
for (const item of items) {
|
|
46
|
+
const restrictedFields = (0, utils_1.processItemFieldRestrictions)(item, fieldsForCheck, extendAbility, query, aclQueryData);
|
|
47
|
+
if (restrictedFields.length > 0) {
|
|
48
|
+
fieldRestrictions.push({
|
|
49
|
+
[entityParamMap.primaryColumnName]: Reflect.get(item, entityParamMap.primaryColumnName),
|
|
50
|
+
fields: restrictedFields,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Transform data using JsonApiTransformerService
|
|
55
|
+
const jsonApiTransformerService = moduleRef.get(json_api_nestjs_1.JsonApiTransformerService);
|
|
56
|
+
const { data, included } = jsonApiTransformerService.transformData(items, query);
|
|
57
|
+
return {
|
|
58
|
+
meta: {
|
|
59
|
+
...meta,
|
|
60
|
+
...(fieldRestrictions.length > 0 && { fieldRestrictions }),
|
|
61
|
+
},
|
|
62
|
+
data,
|
|
63
|
+
...(included ? { included } : {}),
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=get-all-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-all-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-all-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ModuleRef } from '@nestjs/core';
|
|
2
|
+
import { OrmService } from '@klerick/json-api-nestjs';
|
|
3
|
+
export declare function getOneProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): (this: OrmService<E, IdKey>, id: Parameters<OrmService<E, IdKey>["getOne"]>[0], query: Parameters<OrmService<E, IdKey>["getOne"]>[1]) => Promise<E | import("dist/libs/json-api/json-api-nestjs-shared/cjs/src").ResourceObject<E, "object", null, IdKey> | {
|
|
4
|
+
included?: import("dist/libs/json-api/json-api-nestjs-shared/cjs/src").Include<E, IdKey>[] | undefined;
|
|
5
|
+
meta: {
|
|
6
|
+
fieldRestrictions?: {
|
|
7
|
+
id: IdKey;
|
|
8
|
+
fields: string[];
|
|
9
|
+
}[] | undefined;
|
|
10
|
+
};
|
|
11
|
+
data: import("dist/libs/json-api/json-api-nestjs-shared/cjs/src").ResourceData<E, IdKey>;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getOneProxy = getOneProxy;
|
|
4
|
+
const json_api_nestjs_1 = require("@klerick/json-api-nestjs");
|
|
5
|
+
const factories_1 = require("../../../factories");
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
function getOneProxy(moduleRef) {
|
|
8
|
+
return async function getOneBind(id, query) {
|
|
9
|
+
const extendAbility = moduleRef.get(factories_1.ExtendAbility, { strict: false });
|
|
10
|
+
const aclPrepared = (0, utils_1.prepareAclQuery)(extendAbility, query);
|
|
11
|
+
if (!aclPrepared) {
|
|
12
|
+
return this.getOne(id, query);
|
|
13
|
+
}
|
|
14
|
+
(0, utils_1.validateNoCurrentInRules)(extendAbility, 'getOneProxy');
|
|
15
|
+
const { transformToJsonApi, aclQueryData, mergedQuery } = aclPrepared;
|
|
16
|
+
// Fetch entity with ACL conditions - handle errors from invalid ACL rules
|
|
17
|
+
let result;
|
|
18
|
+
try {
|
|
19
|
+
result = await this.getOne(id, mergedQuery, transformToJsonApi, aclQueryData?.rulesForQuery);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'getOneProxy');
|
|
23
|
+
}
|
|
24
|
+
// If already transformed by ORM, return as is
|
|
25
|
+
if (transformToJsonApi) {
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
const resultItem = result;
|
|
29
|
+
const fieldsForCheck = (0, utils_1.extractFieldsForCheck)(moduleRef, resultItem, query, aclQueryData);
|
|
30
|
+
const { entityParamMap } = (0, utils_1.getCurrentEntityAndParamMap)(moduleRef);
|
|
31
|
+
const fieldRestrictions = [];
|
|
32
|
+
const restrictedFields = (0, utils_1.processItemFieldRestrictions)(resultItem, fieldsForCheck, extendAbility, query, aclQueryData);
|
|
33
|
+
if (restrictedFields.length > 0) {
|
|
34
|
+
fieldRestrictions.push({
|
|
35
|
+
[entityParamMap.primaryColumnName]: Reflect.get(resultItem, entityParamMap.primaryColumnName),
|
|
36
|
+
fields: restrictedFields,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const jsonApiTransformerService = moduleRef.get(json_api_nestjs_1.JsonApiTransformerService);
|
|
40
|
+
const { data, included } = jsonApiTransformerService.transformData(resultItem, query);
|
|
41
|
+
return {
|
|
42
|
+
meta: {
|
|
43
|
+
...(fieldRestrictions.length > 0 && { fieldRestrictions }),
|
|
44
|
+
},
|
|
45
|
+
data,
|
|
46
|
+
...(included ? { included } : {}),
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=get-one-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-one-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-one-proxy.ts"],"names":[],"mappings":";;AAgBA,kCA0FC;AAzGD,8DAIkC;AAClC,kDAAmD;AACnD,0CAOwB;AAExB,SAAgB,WAAW,CACzB,SAAoB;IAEpB,OAAO,KAAK,UAAU,UAAU,CAE9B,EAAiD,EACjD,KAAoD;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,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QAED,IAAA,gCAAwB,EAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QAEvD,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAEtE,0EAA0E;QAC1E,IAAI,MAA2D,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CACxB,EAAE,EACF,WAAW,EACX,kBAAkB,EAClB,YAAY,EAAE,aAAa,CAC5B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,2BAAmB,EAAC,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACzE,CAAC;QAED,8CAA8C;QAC9C,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,UAAU,GAAG,MAAW,CAAC;QAE/B,MAAM,cAAc,GAAG,IAAA,6BAAqB,EAC1C,SAAS,EACT,UAAU,EACV,KAAK,EACL,YAAY,CACb,CAAC;QAEF,MAAM,EAAE,cAAc,EAAE,GAAG,IAAA,mCAA2B,EAAC,SAAS,CAAC,CAAC;QAElE,MAAM,iBAAiB,GAA2C,EAAE,CAAC;QAErE,MAAM,gBAAgB,GAAG,IAAA,oCAA4B,EACnD,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,EACL,YAAY,CACb,CAAC;QAEF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,iBAAiB,CAAC,IAAI,CAAC;gBACrB,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,GAAG,CAC7C,UAAU,EACV,cAAc,CAAC,iBAAiB,CACxB;gBACV,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,yBAAyB,GAAG,SAAS,CAAC,GAAG,CAE7C,2CAAyB,CAAC,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,yBAAyB,CAAC,aAAa,CAChE,UAAU,EACV,KAAK,CACN,CAAC;QAEF,OAAO;YACL,IAAI,EAAE;gBACJ,GAAG,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;aAC3D;YACD,IAAI;YACJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC;IACJ,CAAC,CAAA;AACH,CAAC"}
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { OrmService } from '@klerick/json-api-nestjs';
|
|
2
|
+
import { ModuleRef } from '@nestjs/core';
|
|
3
|
+
import { RelationKeys } from '@klerick/json-api-nestjs-shared';
|
|
4
|
+
export declare function getRelationshipProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): <Rel extends RelationKeys<E, IdKey>>(this: OrmService<E, IdKey>, id: IdKey, rel: Rel) => Promise<import("@klerick/json-api-nestjs-shared").ResourceObjectRelationships<E, IdKey, Rel>>;
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getRelationshipProxy = getRelationshipProxy;
|
|
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 getRelationshipProxy(moduleRef) {
|
|
9
|
+
return async function getOneBind(id, rel) {
|
|
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.getRelationship(id, rel);
|
|
17
|
+
}
|
|
18
|
+
(0, utils_1.validateNoCurrentInRules)(extendAbility, 'getRelationshipProxy');
|
|
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, 'getRelationshipProxy');
|
|
29
|
+
}
|
|
30
|
+
const resultItem = result;
|
|
31
|
+
extendAbility.updateWithInput(resultItem);
|
|
32
|
+
if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, resultItem), rel.toString())) {
|
|
33
|
+
common_1.Logger.debug(`Access denied for (action: ${extendAbility.action}, subject: ${extendAbility.subject}), field ${rel.toString()}`, 'getRelationshipProxy', {
|
|
34
|
+
subject: resultItem,
|
|
35
|
+
rules: extendAbility.rules,
|
|
36
|
+
});
|
|
37
|
+
throw new common_1.ForbiddenException([
|
|
38
|
+
{
|
|
39
|
+
code: 'forbidden',
|
|
40
|
+
message: `not allow "${extendAbility.action}"`,
|
|
41
|
+
path: ['action'],
|
|
42
|
+
},
|
|
43
|
+
], {
|
|
44
|
+
description: `Access denied for ${extendAbility.action} on ${extendAbility.subject}`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return this.getRelationship(id, rel);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=get-relationship-proxy.js.map
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-relationship-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/get-relationship-proxy.ts"],"names":[],"mappings":";;AAYA,oDA+EC;AAxFD,kDAAmD;AACnD,0CAIwB;AACxB,2CAAwC;AACxC,2CAA4D;AAE5D,SAAgB,oBAAoB,CAClC,SAAoB;IAEpB,OAAO,KAAK,UAAU,UAAU,CAE9B,EAAS,EACT,GAAQ;QAER,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,CAAC,GAAU,CAAC;YACrB,MAAM,EAAE,IAAI;SACb,EACD,KAAK,CACN,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,IAAA,gCAAwB,EAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;QAEhE,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAEpC,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,EACvB,KAAK,EACL,aAAa,CAAC,OAAO,EACrB,sBAAsB,CACvB,CAAC;QACJ,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,EAC1C,GAAG,CAAC,QAAQ,EAAE,CACf,EACD,CAAC;YACD,eAAM,CAAC,KAAK,CACV,8BAA8B,aAAa,CAAC,MAAM,cAAc,aAAa,CAAC,OAAO,YAAY,GAAG,CAAC,QAAQ,EAAE,EAAE,EACjH,sBAAsB,EACtB;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,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './get-all-proxy';
|
|
2
|
+
export * from './get-one-proxy';
|
|
3
|
+
export * from './delete-one-proxy';
|
|
4
|
+
export * from './patch-one-proxy';
|
|
5
|
+
export * from './post-one-proxy';
|
|
6
|
+
export * from './get-relationship-proxy';
|
|
7
|
+
export * from './delete-relationship-proxy';
|
|
8
|
+
export * from './post-relationship-proxy';
|
|
9
|
+
export * from './patch-relationship-proxy';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./get-all-proxy"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./get-one-proxy"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./delete-one-proxy"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./patch-one-proxy"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./post-one-proxy"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./get-relationship-proxy"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./delete-relationship-proxy"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./post-relationship-proxy"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./patch-relationship-proxy"), exports);
|
|
13
|
+
//# 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/method-proxy/index.ts"],"names":[],"mappings":";;;AAAA,0DAA+B;AAC/B,0DAA+B;AAC/B,6DAAkC;AAClC,4DAAiC;AACjC,2DAAgC;AAChC,mEAAwC;AACxC,sEAA2C;AAC3C,oEAAyC;AACzC,qEAA0C"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ModuleRef } from '@nestjs/core';
|
|
2
|
+
import { OrmService } from '@klerick/json-api-nestjs';
|
|
3
|
+
export declare function patchOneProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): (this: OrmService<E, IdKey>, id: Parameters<OrmService<E, IdKey>["patchOne"]>[0], inputData: Parameters<OrmService<E, IdKey>["patchOne"]>[1]) => Promise<import("dist/libs/json-api/json-api-nestjs-shared/cjs/src").ResourceObject<E, "object", null, IdKey>>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.patchOneProxy = patchOneProxy;
|
|
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 patchOneProxy(moduleRef) {
|
|
9
|
+
return async function patchOneBind(id, inputData) {
|
|
10
|
+
const extendAbility = moduleRef.get(factories_1.ExtendAbility, { strict: false });
|
|
11
|
+
const aclPrepared = (0, utils_1.prepareAclQuery)(extendAbility, {
|
|
12
|
+
include: [],
|
|
13
|
+
fields: null,
|
|
14
|
+
});
|
|
15
|
+
if (!aclPrepared) {
|
|
16
|
+
return this.patchOne(id, inputData);
|
|
17
|
+
}
|
|
18
|
+
const { mergedQuery } = aclPrepared;
|
|
19
|
+
let result;
|
|
20
|
+
try {
|
|
21
|
+
result = await this.getOne(id, {
|
|
22
|
+
fields: null,
|
|
23
|
+
include: mergedQuery.include,
|
|
24
|
+
}, false, undefined);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'patchOneProxy');
|
|
28
|
+
}
|
|
29
|
+
const resultItem = result;
|
|
30
|
+
const { relationships, attributes } = inputData;
|
|
31
|
+
const relationshipsToChange = Object.keys(relationships || {});
|
|
32
|
+
let loadedRelations = {};
|
|
33
|
+
if (relationships) {
|
|
34
|
+
try {
|
|
35
|
+
loadedRelations = await this.loadRelations(relationships);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'patchOneProxy');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const { currentEntity: entityClass, entityParamMapService } = (0, utils_1.getCurrentEntityAndParamMap)(moduleRef);
|
|
42
|
+
const extractor = utils_1.ExtractFieldPaths.getInstance(entityParamMapService);
|
|
43
|
+
const currentEntityPropsOnly = extractor.props(resultItem, entityClass);
|
|
44
|
+
const mergedEntity = {
|
|
45
|
+
...currentEntityPropsOnly,
|
|
46
|
+
...(attributes || {}),
|
|
47
|
+
...loadedRelations,
|
|
48
|
+
};
|
|
49
|
+
// Detect changed attributes by comparing old (DB) vs new (request) values
|
|
50
|
+
// Coverage: ~90% of real-world use cases
|
|
51
|
+
//
|
|
52
|
+
// Comparison strategy:
|
|
53
|
+
// - Primitives (string, number, boolean, null): strict equality (===)
|
|
54
|
+
// - Objects/Arrays: JSON.stringify comparison
|
|
55
|
+
//
|
|
56
|
+
// Known edge cases (acceptable tradeoffs):
|
|
57
|
+
// 1. JSONB fields with different key order may trigger false positives:
|
|
58
|
+
// { a: 1, b: 2 } !== { b: 2, a: 1 } (content identical, but detected as different)
|
|
59
|
+
// 2. Circular references: Not expected in JSON API requests (would fail JSON.parse)
|
|
60
|
+
// 3. Date objects: try to use toISOString() for comparison
|
|
61
|
+
//
|
|
62
|
+
// If you encounter issues, please create a GitHub issue with your use case.
|
|
63
|
+
const changedAttributes = [];
|
|
64
|
+
if (attributes) {
|
|
65
|
+
for (const attrKey of Object.keys(attributes)) {
|
|
66
|
+
let currentValue = currentEntityPropsOnly[attrKey];
|
|
67
|
+
let newValue = attributes[attrKey];
|
|
68
|
+
newValue =
|
|
69
|
+
newValue !== null && typeof newValue === 'object'
|
|
70
|
+
? newValue instanceof Date ? newValue.toISOString() : JSON.stringify(newValue)
|
|
71
|
+
: newValue;
|
|
72
|
+
currentValue =
|
|
73
|
+
currentValue !== null && typeof currentValue === 'object'
|
|
74
|
+
? currentValue instanceof Date ? currentValue.toISOString() : JSON.stringify(currentValue)
|
|
75
|
+
: currentValue;
|
|
76
|
+
if (currentValue !== newValue) {
|
|
77
|
+
changedAttributes.push(attrKey);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const changedFields = [...changedAttributes, ...relationshipsToChange];
|
|
82
|
+
// Entity for check contains:
|
|
83
|
+
// - Root level: NEW values (merged entity after applying changes)
|
|
84
|
+
// - __current: OLD values (entity as loaded from DB)
|
|
85
|
+
// This enables rules to compare old vs new values, e.g.:
|
|
86
|
+
// - Allow removing only self: { '__current.coAuthorIds': { $in: [@input.userId] }, 'coAuthorIds': { $nin: [@input.userId] } }
|
|
87
|
+
const entityForCheck = {
|
|
88
|
+
...mergedEntity,
|
|
89
|
+
__current: resultItem,
|
|
90
|
+
};
|
|
91
|
+
extendAbility.updateWithInput(entityForCheck);
|
|
92
|
+
// Entity-level check
|
|
93
|
+
if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, entityForCheck))) {
|
|
94
|
+
common_1.Logger.debug(`Access denied for (action: ${extendAbility.action}, subject: ${extendAbility.subject})`, 'patchOneProxy', {
|
|
95
|
+
subject: entityForCheck,
|
|
96
|
+
rules: extendAbility.rules,
|
|
97
|
+
});
|
|
98
|
+
throw new common_1.ForbiddenException([
|
|
99
|
+
{
|
|
100
|
+
code: 'forbidden',
|
|
101
|
+
message: `not allow "${extendAbility.action}"`,
|
|
102
|
+
path: ['action'],
|
|
103
|
+
},
|
|
104
|
+
], {
|
|
105
|
+
description: `Access denied for ${extendAbility.action} on ${extendAbility.subject}`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Field-level checks for changed fields
|
|
109
|
+
for (const field of changedFields) {
|
|
110
|
+
if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, entityForCheck), field)) {
|
|
111
|
+
common_1.Logger.debug(`Field-level access denied for field '${field}'`, 'patchOneProxy', {
|
|
112
|
+
field,
|
|
113
|
+
currentValue: entityForCheck.__current[field],
|
|
114
|
+
newValue: entityForCheck[field],
|
|
115
|
+
subject: entityForCheck,
|
|
116
|
+
rules: extendAbility.rules,
|
|
117
|
+
});
|
|
118
|
+
throw new common_1.ForbiddenException([
|
|
119
|
+
{
|
|
120
|
+
code: 'forbidden',
|
|
121
|
+
message: `not allow to modify field "${field}"`,
|
|
122
|
+
path: ['data', 'attributes', field],
|
|
123
|
+
},
|
|
124
|
+
], {
|
|
125
|
+
description: `Field-level access denied for ${field}`,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return this.patchOne(id, inputData);
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=patch-one-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-one-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-one-proxy.ts"],"names":[],"mappings":"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"}
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { OrmService, PatchRelationshipData } from '@klerick/json-api-nestjs';
|
|
2
|
+
import { ModuleRef } from '@nestjs/core';
|
|
3
|
+
import { RelationKeys } from '@klerick/json-api-nestjs-shared';
|
|
4
|
+
export declare function patchRelationshipProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): <Rel extends RelationKeys<E, IdKey>>(this: OrmService<E, IdKey>, id: IdKey, rel: Rel, input: PatchRelationshipData) => Promise<import("@klerick/json-api-nestjs-shared").ResourceObjectRelationships<E, IdKey, Rel>>;
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.patchRelationshipProxy = patchRelationshipProxy;
|
|
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 patchRelationshipProxy(moduleRef) {
|
|
9
|
+
return async function patchRelationshipBind(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.patchRelationship(id, rel, input);
|
|
17
|
+
}
|
|
18
|
+
const { mergedQuery } = aclPrepared;
|
|
19
|
+
let result;
|
|
20
|
+
try {
|
|
21
|
+
result = await this.getOne(id, {
|
|
22
|
+
fields: null,
|
|
23
|
+
include: mergedQuery.include,
|
|
24
|
+
}, false, undefined);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'patchRelationshipProxy');
|
|
28
|
+
}
|
|
29
|
+
const oldResult = result;
|
|
30
|
+
// Transform input to relationships format for loadRelations
|
|
31
|
+
const relationshipsData = {
|
|
32
|
+
[rel]: input,
|
|
33
|
+
};
|
|
34
|
+
let loadedRelations;
|
|
35
|
+
try {
|
|
36
|
+
loadedRelations = await this.loadRelations(relationshipsData);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'patchRelationshipProxy');
|
|
40
|
+
}
|
|
41
|
+
// Entity for check contains:
|
|
42
|
+
// - Root level: old entity + NEW relationships (replacing old ones)
|
|
43
|
+
// - __current: old entity with OLD relationships (as loaded from DB)
|
|
44
|
+
const entityToCheck = {
|
|
45
|
+
...oldResult,
|
|
46
|
+
[rel]: loadedRelations[rel.toString()], // NEW relationships (overwrite old)
|
|
47
|
+
__current: oldResult, // OLD entity with OLD relationships
|
|
48
|
+
};
|
|
49
|
+
extendAbility.updateWithInput(entityToCheck);
|
|
50
|
+
if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, entityToCheck), rel.toString())) {
|
|
51
|
+
common_1.Logger.debug(`Access denied for (action: ${extendAbility.action}, subject: ${extendAbility.subject}), field ${rel.toString()}`, 'patchRelationshipProxy', {
|
|
52
|
+
subject: entityToCheck,
|
|
53
|
+
rules: extendAbility.rules,
|
|
54
|
+
});
|
|
55
|
+
throw new common_1.ForbiddenException([
|
|
56
|
+
{
|
|
57
|
+
code: 'forbidden',
|
|
58
|
+
message: `not allow "${extendAbility.action}"`,
|
|
59
|
+
path: ['action'],
|
|
60
|
+
},
|
|
61
|
+
], {
|
|
62
|
+
description: `Access denied for ${extendAbility.action} on ${extendAbility.subject}`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return this.patchRelationship(id, rel, input);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=patch-relationship-proxy.js.map
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-relationship-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/patch-relationship-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ModuleRef } from '@nestjs/core';
|
|
2
|
+
import { OrmService } from '@klerick/json-api-nestjs';
|
|
3
|
+
export declare function postOneProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): (this: OrmService<E, IdKey>, inputData: Parameters<OrmService<E, IdKey>["postOne"]>[0]) => Promise<import("dist/libs/json-api/json-api-nestjs-shared/cjs/src").ResourceObject<E, "object", null, IdKey>>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.postOneProxy = postOneProxy;
|
|
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 postOneProxy(moduleRef) {
|
|
9
|
+
return async function postOneBind(inputData) {
|
|
10
|
+
const extendAbility = moduleRef.get(factories_1.ExtendAbility, { strict: false });
|
|
11
|
+
if (!extendAbility ||
|
|
12
|
+
extendAbility.rules.length === 0 ||
|
|
13
|
+
(!extendAbility.hasConditions && !extendAbility.hasFields)) {
|
|
14
|
+
return this.postOne(inputData);
|
|
15
|
+
}
|
|
16
|
+
(0, utils_1.validateNoCurrentInRules)(extendAbility, 'postOneProxy');
|
|
17
|
+
const { relationships, attributes } = inputData;
|
|
18
|
+
let loadedRelations = {};
|
|
19
|
+
if (relationships) {
|
|
20
|
+
try {
|
|
21
|
+
loadedRelations = await this.loadRelations(relationships);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'postOneProxy');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const resultEntity = {
|
|
28
|
+
...(attributes || {}),
|
|
29
|
+
...loadedRelations,
|
|
30
|
+
};
|
|
31
|
+
const changedAttributes = [
|
|
32
|
+
...Object.keys(attributes || {}),
|
|
33
|
+
...Object.keys(loadedRelations),
|
|
34
|
+
];
|
|
35
|
+
extendAbility.updateWithInput(resultEntity);
|
|
36
|
+
if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, resultEntity))) {
|
|
37
|
+
common_1.Logger.debug(`Access denied for (action: ${extendAbility.action}, subject: ${extendAbility.subject})`, 'postOneProxy', {
|
|
38
|
+
subject: resultEntity,
|
|
39
|
+
rules: extendAbility.rules,
|
|
40
|
+
});
|
|
41
|
+
throw new common_1.ForbiddenException([
|
|
42
|
+
{
|
|
43
|
+
code: 'forbidden',
|
|
44
|
+
message: `not allow "${extendAbility.action}"`,
|
|
45
|
+
path: ['action'],
|
|
46
|
+
},
|
|
47
|
+
], {
|
|
48
|
+
description: `Access denied for ${extendAbility.action} on ${extendAbility.subject}`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
for (const field of changedAttributes) {
|
|
52
|
+
if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, resultEntity), field)) {
|
|
53
|
+
common_1.Logger.debug(`Field-level access denied for field '${field}'`, 'postOneProxy', {
|
|
54
|
+
field,
|
|
55
|
+
value: resultEntity[field],
|
|
56
|
+
subject: resultEntity,
|
|
57
|
+
rules: extendAbility.rules,
|
|
58
|
+
});
|
|
59
|
+
throw new common_1.ForbiddenException([
|
|
60
|
+
{
|
|
61
|
+
code: 'forbidden',
|
|
62
|
+
message: `not allow to set field "${field}"`,
|
|
63
|
+
path: ['data', 'attributes', field],
|
|
64
|
+
},
|
|
65
|
+
], {
|
|
66
|
+
description: `Field-level access denied for ${field}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return this.postOne(inputData);
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=post-one-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-one-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-one-proxy.ts"],"names":[],"mappings":"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"}
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-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 postRelationshipProxy<E extends object, IdKey extends string>(moduleRef: ModuleRef): <Rel extends RelationKeys<E, IdKey>>(this: OrmService<E, IdKey>, id: IdKey, rel: Rel, input: PostRelationshipData) => Promise<import("@klerick/json-api-nestjs-shared").ResourceObjectRelationships<E, IdKey, Rel>>;
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.postRelationshipProxy = postRelationshipProxy;
|
|
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 postRelationshipProxy(moduleRef) {
|
|
9
|
+
return async function postRelationshipBind(id, rel, input) {
|
|
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.postRelationship(id, rel, input);
|
|
17
|
+
}
|
|
18
|
+
(0, utils_1.validateNoCurrentInRules)(extendAbility, 'postRelationshipProxy');
|
|
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, 'postRelationshipProxy');
|
|
29
|
+
}
|
|
30
|
+
const resultItem = result;
|
|
31
|
+
// Transform input to relationships format for loadRelations
|
|
32
|
+
const relationshipsData = {
|
|
33
|
+
[rel]: input,
|
|
34
|
+
};
|
|
35
|
+
let loadedRelations;
|
|
36
|
+
try {
|
|
37
|
+
loadedRelations = await this.loadRelations(relationshipsData);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw (0, utils_1.handleAclQueryError)(error, extendAbility.subject, 'postRelationshipProxy');
|
|
41
|
+
}
|
|
42
|
+
// Merge entity with relations being added
|
|
43
|
+
const entityToCheck = {
|
|
44
|
+
...resultItem,
|
|
45
|
+
...loadedRelations,
|
|
46
|
+
};
|
|
47
|
+
extendAbility.updateWithInput(entityToCheck);
|
|
48
|
+
if (!extendAbility.can(extendAbility.action, (0, ability_1.subject)(extendAbility.subject, entityToCheck), rel.toString())) {
|
|
49
|
+
common_1.Logger.debug(`Access denied for (action: ${extendAbility.action}, subject: ${extendAbility.subject}), field ${rel.toString()}`, 'postRelationshipProxy', {
|
|
50
|
+
subject: entityToCheck,
|
|
51
|
+
rules: extendAbility.rules,
|
|
52
|
+
});
|
|
53
|
+
throw new common_1.ForbiddenException([
|
|
54
|
+
{
|
|
55
|
+
code: 'forbidden',
|
|
56
|
+
message: `not allow "${extendAbility.action}"`,
|
|
57
|
+
path: ['action'],
|
|
58
|
+
},
|
|
59
|
+
], {
|
|
60
|
+
description: `Access denied for ${extendAbility.action} on ${extendAbility.subject}`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return this.postRelationship(id, rel, input);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=post-relationship-proxy.js.map
|
package/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-relationship-proxy.js","sourceRoot":"","sources":["../../../../../../../../../libs/acl-permissions/nestjs-acl-permissions/src/lib/wrappers/wrapper-json-method-controller/method-proxy/post-relationship-proxy.ts"],"names":[],"mappings":";;AAYA,sDAwGC;AAjHD,kDAAmD;AACnD,0CAIwB;AACxB,2CAAwC;AACxC,2CAA4D;AAE5D,SAAgB,qBAAqB,CACnC,SAAoB;IAEpB,OAAO,KAAK,UAAU,oBAAoB,CAExC,EAAS,EACT,GAAQ,EACR,KAA2B;QAE3B,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,EACD,KAAK,CACN,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QAED,IAAA,gCAAwB,EAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;QAEjE,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAEpC,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,EACvB,KAAK,EACL,aAAa,CAAC,OAAO,EACrB,uBAAuB,CACxB,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAW,CAAC;QAE/B,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG;YACxB,CAAC,GAAG,CAAC,EAAE,KAAK;SAC0B,CAAC;QAEzC,IAAI,eAA6C,CAAC;QAElD,IAAI,CAAC;YACH,eAAe,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,2BAAmB,EACvB,KAAK,EACL,aAAa,CAAC,OAAO,EACrB,uBAAuB,CACxB,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,MAAM,aAAa,GAAG;YACpB,GAAG,UAAU;YACb,GAAG,eAAe;SACd,CAAC;QAEP,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QAC7C,IACE,CAAC,aAAa,CAAC,GAAG,CAChB,aAAa,CAAC,MAAM,EACpB,IAAA,iBAAO,EAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,EAC7C,GAAG,CAAC,QAAQ,EAAE,CACf,EACD,CAAC;YACD,eAAM,CAAC,KAAK,CACV,8BAA8B,aAAa,CAAC,MAAM,cAAc,aAAa,CAAC,OAAO,YAAY,GAAG,CAAC,QAAQ,EAAE,EAAE,EACjH,uBAAuB,EACvB;gBACE,OAAO,EAAE,aAAa;gBACtB,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,gBAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC"}
|