@elsikora/nestjs-crud-automator 1.16.0-dev.1 → 1.17.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -0
- package/dist/cjs/class/api/authorization/engine.class.d.ts +8 -0
- package/dist/cjs/class/api/authorization/engine.class.js +92 -0
- package/dist/cjs/class/api/authorization/engine.class.js.map +1 -0
- package/dist/cjs/class/api/authorization/guard.class.d.ts +13 -0
- package/dist/cjs/class/api/authorization/guard.class.js +79 -0
- package/dist/cjs/class/api/authorization/guard.class.js.map +1 -0
- package/dist/cjs/class/api/authorization/index.d.ts +3 -0
- package/dist/cjs/class/api/authorization/policy/base.class.d.ts +37 -0
- package/dist/cjs/class/api/authorization/policy/base.class.js +68 -0
- package/dist/cjs/class/api/authorization/policy/base.class.js.map +1 -0
- package/dist/cjs/class/api/authorization/policy/discovery-service.class.d.ts +10 -0
- package/dist/cjs/class/api/authorization/policy/discovery-service.class.js +53 -0
- package/dist/cjs/class/api/authorization/policy/discovery-service.class.js.map +1 -0
- package/dist/cjs/class/api/authorization/policy/executor.class.d.ts +8 -0
- package/dist/cjs/class/api/authorization/policy/executor.class.js +43 -0
- package/dist/cjs/class/api/authorization/policy/executor.class.js.map +1 -0
- package/dist/cjs/class/api/authorization/policy/index.d.ts +4 -0
- package/dist/cjs/class/api/authorization/policy/registry.class.d.ts +26 -0
- package/dist/cjs/class/api/authorization/policy/registry.class.js +151 -0
- package/dist/cjs/class/api/authorization/policy/registry.class.js.map +1 -0
- package/dist/cjs/class/api/service-base.class.d.ts +2 -2
- package/dist/cjs/class/api/service-base.class.js.map +1 -1
- package/dist/cjs/class/index.d.ts +1 -0
- package/dist/cjs/constant/authorization/index.d.ts +3 -0
- package/dist/cjs/constant/authorization/metadata/decision.constant.d.ts +3 -0
- package/dist/cjs/constant/authorization/metadata/decision.constant.js +9 -0
- package/dist/cjs/constant/authorization/metadata/decision.constant.js.map +1 -0
- package/dist/cjs/constant/authorization/metadata/index.d.ts +1 -0
- package/dist/cjs/constant/authorization/policy/decorator.constant.d.ts +4 -0
- package/dist/cjs/constant/authorization/policy/decorator.constant.js +11 -0
- package/dist/cjs/constant/authorization/policy/decorator.constant.js.map +1 -0
- package/dist/cjs/constant/authorization/policy/index.d.ts +1 -0
- package/dist/cjs/constant/authorization/token/index.d.ts +1 -0
- package/dist/cjs/constant/authorization/token/registry.constant.d.ts +1 -0
- package/dist/cjs/constant/authorization/token/registry.constant.js +7 -0
- package/dist/cjs/constant/authorization/token/registry.constant.js.map +1 -0
- package/dist/cjs/constant/decorator/api/controller.constant.d.ts +2 -0
- package/dist/cjs/constant/decorator/api/controller.constant.js +4 -0
- package/dist/cjs/constant/decorator/api/controller.constant.js.map +1 -1
- package/dist/cjs/constant/index.d.ts +1 -0
- package/dist/cjs/decorator/api/authorization/index.d.ts +1 -0
- package/dist/cjs/decorator/api/authorization/policy.decorator.d.ts +9 -0
- package/dist/cjs/decorator/api/authorization/policy.decorator.js +25 -0
- package/dist/cjs/decorator/api/authorization/policy.decorator.js.map +1 -0
- package/dist/cjs/decorator/api/controller/index.d.ts +1 -0
- package/dist/cjs/decorator/api/controller/securable.decorator.d.ts +6 -0
- package/dist/cjs/decorator/api/controller/securable.decorator.js +17 -0
- package/dist/cjs/decorator/api/controller/securable.decorator.js.map +1 -0
- package/dist/cjs/decorator/api/index.d.ts +1 -0
- package/dist/cjs/decorator/api/method.decorator.js +7 -1
- package/dist/cjs/decorator/api/method.decorator.js.map +1 -1
- package/dist/cjs/enum/authorization/effect.enum.d.ts +4 -0
- package/dist/cjs/enum/authorization/effect.enum.js +8 -0
- package/dist/cjs/enum/authorization/effect.enum.js.map +1 -0
- package/dist/cjs/enum/authorization/index.d.ts +2 -0
- package/dist/cjs/enum/authorization/policy/index.d.ts +1 -0
- package/dist/cjs/enum/authorization/policy/on-type.enum.d.ts +3 -0
- package/dist/cjs/enum/authorization/policy/on-type.enum.js +7 -0
- package/dist/cjs/enum/authorization/policy/on-type.enum.js.map +1 -0
- package/dist/cjs/enum/index.d.ts +1 -0
- package/dist/cjs/external/tslib/tslib.es6.js +5 -0
- package/dist/cjs/external/tslib/tslib.es6.js.map +1 -1
- package/dist/cjs/factory/api/controller.factory.js +63 -28
- package/dist/cjs/factory/api/controller.factory.js.map +1 -1
- package/dist/cjs/index.js +60 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interface/api-authentication-request.interface.d.ts +3 -0
- package/dist/cjs/interface/authorization/decision.interface.d.ts +17 -0
- package/dist/cjs/interface/authorization/engine.interface.d.ts +6 -0
- package/dist/cjs/interface/authorization/evaluate-options.interface.d.ts +9 -0
- package/dist/cjs/interface/authorization/index.d.ts +7 -0
- package/dist/cjs/interface/authorization/policy/index.d.ts +3 -0
- package/dist/cjs/interface/authorization/policy/interface.d.ts +9 -0
- package/dist/cjs/interface/authorization/policy/registry.interface.d.ts +10 -0
- package/dist/cjs/interface/authorization/policy/subscriber/context.interface.d.ts +9 -0
- package/dist/cjs/interface/authorization/policy/subscriber/index.d.ts +5 -0
- package/dist/cjs/interface/authorization/policy/subscriber/interface.d.ts +14 -0
- package/dist/cjs/interface/authorization/policy/subscriber/properties.interface.d.ts +7 -0
- package/dist/cjs/interface/authorization/policy/subscriber/registration.interface.d.ts +9 -0
- package/dist/cjs/interface/authorization/policy/subscriber/rule.interface.d.ts +13 -0
- package/dist/cjs/interface/authorization/rule/context.interface.d.ts +6 -0
- package/dist/cjs/interface/authorization/rule/index.d.ts +2 -0
- package/dist/cjs/interface/authorization/rule/interface.d.ts +15 -0
- package/dist/cjs/interface/authorization/scope.interface.d.ts +5 -0
- package/dist/cjs/interface/authorization/subject.interface.d.ts +6 -0
- package/dist/cjs/interface/class/api/subscriber/route-execution-context-data.interface.d.ts +7 -1
- package/dist/cjs/interface/index.d.ts +1 -0
- package/dist/cjs/module/api/authorization.module.d.ts +7 -0
- package/dist/cjs/module/api/authorization.module.js +39 -0
- package/dist/cjs/module/api/authorization.module.js.map +1 -0
- package/dist/cjs/module/api/index.d.ts +2 -0
- package/dist/cjs/module/{api-subscriber.module.js → api/subscriber.module.js} +3 -3
- package/dist/cjs/module/api/subscriber.module.js.map +1 -0
- package/dist/cjs/module/index.d.ts +1 -1
- package/dist/cjs/type/class/api/authorization/guard-request.type.d.ts +7 -0
- package/dist/cjs/type/class/api/authorization/index.d.ts +4 -0
- package/dist/cjs/type/class/api/authorization/policy/hook/index.d.ts +2 -0
- package/dist/cjs/type/class/api/authorization/policy/hook/result.type.d.ts +8 -0
- package/dist/cjs/type/class/api/authorization/policy/hook/type.d.ts +5 -0
- package/dist/cjs/type/class/api/authorization/policy/index.d.ts +2 -0
- package/dist/cjs/type/class/api/authorization/policy/policy-subscriber-rule-result.type.d.ts +3 -0
- package/dist/cjs/type/class/api/authorization/rule/condition.type.d.ts +3 -0
- package/dist/cjs/type/class/api/authorization/rule/index.d.ts +4 -0
- package/dist/cjs/type/class/api/authorization/rule/result-transform.type.d.ts +4 -0
- package/dist/cjs/type/class/api/authorization/rule/scope-resolver.type.d.ts +4 -0
- package/dist/cjs/type/class/api/authorization/rule/transform-payload.type.d.ts +3 -0
- package/dist/cjs/type/class/api/authorization/scope-where.type.d.ts +3 -0
- package/dist/cjs/type/class/api/subscriber/route/after/create-context.type.d.ts +1 -1
- package/dist/cjs/type/class/api/subscriber/route/after/delete-context.type.d.ts +1 -1
- package/dist/cjs/type/class/api/subscriber/route/after/get/context.type.d.ts +1 -1
- package/dist/cjs/type/class/api/subscriber/route/after/get/list-context.type.d.ts +2 -1
- package/dist/cjs/type/class/api/subscriber/route/after/get/many-context.type.d.ts +1 -1
- package/dist/cjs/type/class/api/subscriber/route/after/update-context.type.d.ts +1 -1
- package/dist/cjs/type/index.d.ts +1 -0
- package/dist/cjs/utility/api/controller/apply-metadata.utility.js +3 -5
- package/dist/cjs/utility/api/controller/apply-metadata.utility.js.map +1 -1
- package/dist/cjs/utility/authorization/decision/apply-result.utility.d.ts +12 -0
- package/dist/cjs/utility/authorization/decision/apply-result.utility.js +27 -0
- package/dist/cjs/utility/authorization/decision/apply-result.utility.js.map +1 -0
- package/dist/cjs/utility/authorization/decision/attach-resource.utility.d.ts +11 -0
- package/dist/cjs/utility/authorization/decision/attach-resource.utility.js +20 -0
- package/dist/cjs/utility/authorization/decision/attach-resource.utility.js.map +1 -0
- package/dist/cjs/utility/authorization/decision/index.d.ts +3 -0
- package/dist/cjs/utility/authorization/decision/resolve-from-request.utility.d.ts +12 -0
- package/dist/cjs/utility/authorization/decision/resolve-from-request.utility.js +22 -0
- package/dist/cjs/utility/authorization/decision/resolve-from-request.utility.js.map +1 -0
- package/dist/cjs/utility/authorization/index.d.ts +3 -0
- package/dist/cjs/utility/authorization/scope/index.d.ts +1 -0
- package/dist/cjs/utility/authorization/scope/merge/index.d.ts +1 -0
- package/dist/cjs/utility/authorization/scope/merge/where.utility.d.ts +10 -0
- package/dist/cjs/utility/authorization/scope/merge/where.utility.js +32 -0
- package/dist/cjs/utility/authorization/scope/merge/where.utility.js.map +1 -0
- package/dist/cjs/utility/authorization/subject/index.d.ts +1 -0
- package/dist/cjs/utility/authorization/subject/resolve-default-subject.utility.d.ts +7 -0
- package/dist/cjs/utility/authorization/subject/resolve-default-subject.utility.js +52 -0
- package/dist/cjs/utility/authorization/subject/resolve-default-subject.utility.js.map +1 -0
- package/dist/cjs/utility/index.d.ts +1 -0
- package/dist/esm/class/api/authorization/engine.class.d.ts +8 -0
- package/dist/esm/class/api/authorization/engine.class.js +92 -0
- package/dist/esm/class/api/authorization/engine.class.js.map +1 -0
- package/dist/esm/class/api/authorization/guard.class.d.ts +13 -0
- package/dist/esm/class/api/authorization/guard.class.js +79 -0
- package/dist/esm/class/api/authorization/guard.class.js.map +1 -0
- package/dist/esm/class/api/authorization/index.d.ts +3 -0
- package/dist/esm/class/api/authorization/policy/base.class.d.ts +37 -0
- package/dist/esm/class/api/authorization/policy/base.class.js +66 -0
- package/dist/esm/class/api/authorization/policy/base.class.js.map +1 -0
- package/dist/esm/class/api/authorization/policy/discovery-service.class.d.ts +10 -0
- package/dist/esm/class/api/authorization/policy/discovery-service.class.js +53 -0
- package/dist/esm/class/api/authorization/policy/discovery-service.class.js.map +1 -0
- package/dist/esm/class/api/authorization/policy/executor.class.d.ts +8 -0
- package/dist/esm/class/api/authorization/policy/executor.class.js +41 -0
- package/dist/esm/class/api/authorization/policy/executor.class.js.map +1 -0
- package/dist/esm/class/api/authorization/policy/index.d.ts +4 -0
- package/dist/esm/class/api/authorization/policy/registry.class.d.ts +26 -0
- package/dist/esm/class/api/authorization/policy/registry.class.js +148 -0
- package/dist/esm/class/api/authorization/policy/registry.class.js.map +1 -0
- package/dist/esm/class/api/service-base.class.d.ts +2 -2
- package/dist/esm/class/api/service-base.class.js.map +1 -1
- package/dist/esm/class/index.d.ts +1 -0
- package/dist/esm/constant/authorization/index.d.ts +3 -0
- package/dist/esm/constant/authorization/metadata/decision.constant.d.ts +3 -0
- package/dist/esm/constant/authorization/metadata/decision.constant.js +7 -0
- package/dist/esm/constant/authorization/metadata/decision.constant.js.map +1 -0
- package/dist/esm/constant/authorization/metadata/index.d.ts +1 -0
- package/dist/esm/constant/authorization/policy/decorator.constant.d.ts +4 -0
- package/dist/esm/constant/authorization/policy/decorator.constant.js +9 -0
- package/dist/esm/constant/authorization/policy/decorator.constant.js.map +1 -0
- package/dist/esm/constant/authorization/policy/index.d.ts +1 -0
- package/dist/esm/constant/authorization/token/index.d.ts +1 -0
- package/dist/esm/constant/authorization/token/registry.constant.d.ts +1 -0
- package/dist/esm/constant/authorization/token/registry.constant.js +5 -0
- package/dist/esm/constant/authorization/token/registry.constant.js.map +1 -0
- package/dist/esm/constant/decorator/api/controller.constant.d.ts +2 -0
- package/dist/esm/constant/decorator/api/controller.constant.js +4 -0
- package/dist/esm/constant/decorator/api/controller.constant.js.map +1 -1
- package/dist/esm/constant/index.d.ts +1 -0
- package/dist/esm/decorator/api/authorization/index.d.ts +1 -0
- package/dist/esm/decorator/api/authorization/policy.decorator.d.ts +9 -0
- package/dist/esm/decorator/api/authorization/policy.decorator.js +23 -0
- package/dist/esm/decorator/api/authorization/policy.decorator.js.map +1 -0
- package/dist/esm/decorator/api/controller/index.d.ts +1 -0
- package/dist/esm/decorator/api/controller/securable.decorator.d.ts +6 -0
- package/dist/esm/decorator/api/controller/securable.decorator.js +15 -0
- package/dist/esm/decorator/api/controller/securable.decorator.js.map +1 -0
- package/dist/esm/decorator/api/index.d.ts +1 -0
- package/dist/esm/decorator/api/method.decorator.js +7 -1
- package/dist/esm/decorator/api/method.decorator.js.map +1 -1
- package/dist/esm/enum/authorization/effect.enum.d.ts +4 -0
- package/dist/esm/enum/authorization/effect.enum.js +8 -0
- package/dist/esm/enum/authorization/effect.enum.js.map +1 -0
- package/dist/esm/enum/authorization/index.d.ts +2 -0
- package/dist/esm/enum/authorization/policy/index.d.ts +1 -0
- package/dist/esm/enum/authorization/policy/on-type.enum.d.ts +3 -0
- package/dist/esm/enum/authorization/policy/on-type.enum.js +7 -0
- package/dist/esm/enum/authorization/policy/on-type.enum.js.map +1 -0
- package/dist/esm/enum/index.d.ts +1 -0
- package/dist/esm/external/tslib/tslib.es6.js +5 -1
- package/dist/esm/external/tslib/tslib.es6.js.map +1 -1
- package/dist/esm/factory/api/controller.factory.js +63 -28
- package/dist/esm/factory/api/controller.factory.js.map +1 -1
- package/dist/esm/index.js +20 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interface/api-authentication-request.interface.d.ts +3 -0
- package/dist/esm/interface/authorization/decision.interface.d.ts +17 -0
- package/dist/esm/interface/authorization/engine.interface.d.ts +6 -0
- package/dist/esm/interface/authorization/evaluate-options.interface.d.ts +9 -0
- package/dist/esm/interface/authorization/index.d.ts +7 -0
- package/dist/esm/interface/authorization/policy/index.d.ts +3 -0
- package/dist/esm/interface/authorization/policy/interface.d.ts +9 -0
- package/dist/esm/interface/authorization/policy/registry.interface.d.ts +10 -0
- package/dist/esm/interface/authorization/policy/subscriber/context.interface.d.ts +9 -0
- package/dist/esm/interface/authorization/policy/subscriber/index.d.ts +5 -0
- package/dist/esm/interface/authorization/policy/subscriber/interface.d.ts +14 -0
- package/dist/esm/interface/authorization/policy/subscriber/properties.interface.d.ts +7 -0
- package/dist/esm/interface/authorization/policy/subscriber/registration.interface.d.ts +9 -0
- package/dist/esm/interface/authorization/policy/subscriber/rule.interface.d.ts +13 -0
- package/dist/esm/interface/authorization/rule/context.interface.d.ts +6 -0
- package/dist/esm/interface/authorization/rule/index.d.ts +2 -0
- package/dist/esm/interface/authorization/rule/interface.d.ts +15 -0
- package/dist/esm/interface/authorization/scope.interface.d.ts +5 -0
- package/dist/esm/interface/authorization/subject.interface.d.ts +6 -0
- package/dist/esm/interface/class/api/subscriber/route-execution-context-data.interface.d.ts +7 -1
- package/dist/esm/interface/index.d.ts +1 -0
- package/dist/esm/module/api/authorization.module.d.ts +7 -0
- package/dist/esm/module/api/authorization.module.js +39 -0
- package/dist/esm/module/api/authorization.module.js.map +1 -0
- package/dist/esm/module/api/index.d.ts +2 -0
- package/dist/esm/module/{api-subscriber.module.js → api/subscriber.module.js} +3 -3
- package/dist/esm/module/api/subscriber.module.js.map +1 -0
- package/dist/esm/module/index.d.ts +1 -1
- package/dist/esm/type/class/api/authorization/guard-request.type.d.ts +7 -0
- package/dist/esm/type/class/api/authorization/index.d.ts +4 -0
- package/dist/esm/type/class/api/authorization/policy/hook/index.d.ts +2 -0
- package/dist/esm/type/class/api/authorization/policy/hook/result.type.d.ts +8 -0
- package/dist/esm/type/class/api/authorization/policy/hook/type.d.ts +5 -0
- package/dist/esm/type/class/api/authorization/policy/index.d.ts +2 -0
- package/dist/esm/type/class/api/authorization/policy/policy-subscriber-rule-result.type.d.ts +3 -0
- package/dist/esm/type/class/api/authorization/rule/condition.type.d.ts +3 -0
- package/dist/esm/type/class/api/authorization/rule/index.d.ts +4 -0
- package/dist/esm/type/class/api/authorization/rule/result-transform.type.d.ts +4 -0
- package/dist/esm/type/class/api/authorization/rule/scope-resolver.type.d.ts +4 -0
- package/dist/esm/type/class/api/authorization/rule/transform-payload.type.d.ts +3 -0
- package/dist/esm/type/class/api/authorization/scope-where.type.d.ts +3 -0
- package/dist/esm/type/class/api/subscriber/route/after/create-context.type.d.ts +1 -1
- package/dist/esm/type/class/api/subscriber/route/after/delete-context.type.d.ts +1 -1
- package/dist/esm/type/class/api/subscriber/route/after/get/context.type.d.ts +1 -1
- package/dist/esm/type/class/api/subscriber/route/after/get/list-context.type.d.ts +2 -1
- package/dist/esm/type/class/api/subscriber/route/after/get/many-context.type.d.ts +1 -1
- package/dist/esm/type/class/api/subscriber/route/after/update-context.type.d.ts +1 -1
- package/dist/esm/type/index.d.ts +1 -0
- package/dist/esm/utility/api/controller/apply-metadata.utility.js +3 -5
- package/dist/esm/utility/api/controller/apply-metadata.utility.js.map +1 -1
- package/dist/esm/utility/authorization/decision/apply-result.utility.d.ts +12 -0
- package/dist/esm/utility/authorization/decision/apply-result.utility.js +25 -0
- package/dist/esm/utility/authorization/decision/apply-result.utility.js.map +1 -0
- package/dist/esm/utility/authorization/decision/attach-resource.utility.d.ts +11 -0
- package/dist/esm/utility/authorization/decision/attach-resource.utility.js +18 -0
- package/dist/esm/utility/authorization/decision/attach-resource.utility.js.map +1 -0
- package/dist/esm/utility/authorization/decision/index.d.ts +3 -0
- package/dist/esm/utility/authorization/decision/resolve-from-request.utility.d.ts +12 -0
- package/dist/esm/utility/authorization/decision/resolve-from-request.utility.js +20 -0
- package/dist/esm/utility/authorization/decision/resolve-from-request.utility.js.map +1 -0
- package/dist/esm/utility/authorization/index.d.ts +3 -0
- package/dist/esm/utility/authorization/scope/index.d.ts +1 -0
- package/dist/esm/utility/authorization/scope/merge/index.d.ts +1 -0
- package/dist/esm/utility/authorization/scope/merge/where.utility.d.ts +10 -0
- package/dist/esm/utility/authorization/scope/merge/where.utility.js +30 -0
- package/dist/esm/utility/authorization/scope/merge/where.utility.js.map +1 -0
- package/dist/esm/utility/authorization/subject/index.d.ts +1 -0
- package/dist/esm/utility/authorization/subject/resolve-default-subject.utility.d.ts +7 -0
- package/dist/esm/utility/authorization/subject/resolve-default-subject.utility.js +50 -0
- package/dist/esm/utility/authorization/subject/resolve-default-subject.utility.js.map +1 -0
- package/dist/esm/utility/index.d.ts +1 -0
- package/package.json +1 -1
- package/dist/cjs/module/api-subscriber.module.js.map +0 -1
- package/dist/esm/module/api-subscriber.module.js.map +0 -1
- /package/dist/cjs/module/{api-subscriber.module.d.ts → api/subscriber.module.d.ts} +0 -0
- /package/dist/esm/module/{api-subscriber.module.d.ts → api/subscriber.module.d.ts} +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
|
|
2
2
|
import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
|
|
3
3
|
import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
|
|
4
|
-
|
|
4
|
+
import type { IApiGetListResponseResult } from '../../../../../../../interface/decorator/api/get-list-response-result.interface';
|
|
5
|
+
export type TApiSubscriberRouteAfterGetListContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, IApiGetListResponseResult<E>, IApiSubscriberRouteExecutionContextDataExtended<E, IApiGetListResponseResult<E>>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { IApiBaseEntity } from '../../../../../../../interface/api-base-entity.interface';
|
|
2
2
|
import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
|
|
3
3
|
import type { IApiSubscriberRouteExecutionContext } from '../../../../../../../interface/class/api/subscriber/route-execution-context.interface';
|
|
4
|
-
export type TApiSubscriberRouteAfterGetManyContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, Array<E>, IApiSubscriberRouteExecutionContextDataExtended<E
|
|
4
|
+
export type TApiSubscriberRouteAfterGetManyContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, Array<E>, IApiSubscriberRouteExecutionContextDataExtended<E, Array<E>>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { IApiBaseEntity } from '../../../../../../interface/api-base-entity.interface';
|
|
2
2
|
import type { IApiSubscriberRouteExecutionContextDataExtended } from '../../../../../../interface/class/api/subscriber/route-execution-context-data.interface';
|
|
3
3
|
import type { IApiSubscriberRouteExecutionContext } from '../../../../../../interface/class/api/subscriber/route-execution-context.interface';
|
|
4
|
-
export type TApiSubscriberRouteAfterUpdateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E>>;
|
|
4
|
+
export type TApiSubscriberRouteAfterUpdateContext<E extends IApiBaseEntity> = IApiSubscriberRouteExecutionContext<E, E, IApiSubscriberRouteExecutionContextDataExtended<E, E>>;
|
package/dist/cjs/type/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { type TApiRequestTransformer } from './api-request-transformer.type';
|
|
2
2
|
export type * from './class/index';
|
|
3
|
+
export type * from './class/api/authorization/index';
|
|
3
4
|
export type * from './decorator/api/controller/index';
|
|
4
5
|
export type * from './decorator/api/filter/index';
|
|
5
6
|
export type * from './decorator/api/function/index';
|
|
@@ -76,11 +76,9 @@ function ApiControllerApplyMetadata(target, targetPrototype, entity, properties,
|
|
|
76
76
|
routeArgumentsMetadata = common.assignMetadata(routeArgumentsMetadata, routeParamtypes_enum.RouteParamtypes.IP, parameterIndex);
|
|
77
77
|
parameterTypes.push(Object);
|
|
78
78
|
parameterIndex++;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
parameterIndex++;
|
|
83
|
-
}
|
|
79
|
+
routeArgumentsMetadata = common.assignMetadata(routeArgumentsMetadata, routeParamtypes_enum.RouteParamtypes.REQUEST, parameterIndex);
|
|
80
|
+
parameterTypes.push(Object);
|
|
81
|
+
parameterIndex++;
|
|
84
82
|
Reflect.defineMetadata(constants.ROUTE_ARGS_METADATA, routeArgumentsMetadata, target, methodName);
|
|
85
83
|
Reflect.defineMetadata(constants.PARAMTYPES_METADATA, parameterTypes, targetPrototype, methodName);
|
|
86
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-metadata.utility.js","sources":["../../../../../../src/utility/api/controller/apply-metadata.utility.ts"],"sourcesContent":[null],"names":["DtoGenerate","EApiDtoType","assignMetadata","RouteParamtypes","ROUTE_ARGS_METADATA","PARAMTYPES_METADATA"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYG;AACG,SAAU,0BAA0B,CAAI,MAAc,EAAE,eAAuB,EAAE,MAAqB,EAAE,UAAuC,EAAE,MAAqB,EAAE,UAAkB,EAAE,WAA4D,EAAA;IAC7P,IAAI,cAAc,GAAW,CAAC;IAC9B,IAAI,sBAAsB,GAAY,EAAE;IACxC,MAAM,cAAc,GAAmB,EAAE;AAEzC,IAAA,MAAM,UAAU,GAA8B,WAAW,CAAC,GAAG,EAAE,OAAO,IAAIA,4BAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAEC,wBAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,GAAGA,wBAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AAC5N,IAAA,MAAM,QAAQ,GAA8B,WAAW,CAAC,GAAG,EAAE,KAAK,IAAID,4BAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAEC,wBAAW,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAGA,wBAAW,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AACpN,IAAA,MAAM,OAAO,GAA8B,WAAW,CAAC,GAAG,EAAE,IAAI,IAAID,4BAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAEC,wBAAW,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,GAAGA,wBAAW,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;IAEhN,IAAI,UAAU,EAAE;QACf,sBAAsB,GAAGC,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,KAAK,EAAE,cAAc,CAAC;AACtG,QAAA,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;AAC/B,QAAA,cAAc,EAAE;IACjB;IAEA,IAAI,QAAQ,EAAE;QACb,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,KAAK,EAAE,cAAc,CAAC;AACtG,QAAA,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,QAAA,cAAc,EAAE;IACjB;IAEA,IAAI,OAAO,EAAE;QACZ,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,IAAI,EAAE,cAAc,CAAC;AACrG,QAAA,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5B,QAAA,cAAc,EAAE;IACjB;IAEA,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,OAAO,EAAE,cAAc,CAAC;AACxG,IAAA,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,IAAA,cAAc,EAAE;IAEhB,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,EAAE,EAAE,cAAc,CAAC;AACnG,IAAA,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,IAAA,cAAc,EAAE;
|
|
1
|
+
{"version":3,"file":"apply-metadata.utility.js","sources":["../../../../../../src/utility/api/controller/apply-metadata.utility.ts"],"sourcesContent":[null],"names":["DtoGenerate","EApiDtoType","assignMetadata","RouteParamtypes","ROUTE_ARGS_METADATA","PARAMTYPES_METADATA"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA;;;;;;;;;;;;AAYG;AACG,SAAU,0BAA0B,CAAI,MAAc,EAAE,eAAuB,EAAE,MAAqB,EAAE,UAAuC,EAAE,MAAqB,EAAE,UAAkB,EAAE,WAA4D,EAAA;IAC7P,IAAI,cAAc,GAAW,CAAC;IAC9B,IAAI,sBAAsB,GAAY,EAAE;IACxC,MAAM,cAAc,GAAmB,EAAE;AAEzC,IAAA,MAAM,UAAU,GAA8B,WAAW,CAAC,GAAG,EAAE,OAAO,IAAIA,4BAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAEC,wBAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,GAAGA,wBAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AAC5N,IAAA,MAAM,QAAQ,GAA8B,WAAW,CAAC,GAAG,EAAE,KAAK,IAAID,4BAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAEC,wBAAW,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAGA,wBAAW,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AACpN,IAAA,MAAM,OAAO,GAA8B,WAAW,CAAC,GAAG,EAAE,IAAI,IAAID,4BAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAEC,wBAAW,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,GAAGA,wBAAW,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;IAEhN,IAAI,UAAU,EAAE;QACf,sBAAsB,GAAGC,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,KAAK,EAAE,cAAc,CAAC;AACtG,QAAA,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;AAC/B,QAAA,cAAc,EAAE;IACjB;IAEA,IAAI,QAAQ,EAAE;QACb,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,KAAK,EAAE,cAAc,CAAC;AACtG,QAAA,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7B,QAAA,cAAc,EAAE;IACjB;IAEA,IAAI,OAAO,EAAE;QACZ,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,IAAI,EAAE,cAAc,CAAC;AACrG,QAAA,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5B,QAAA,cAAc,EAAE;IACjB;IAEA,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,OAAO,EAAE,cAAc,CAAC;AACxG,IAAA,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,IAAA,cAAc,EAAE;IAEhB,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,EAAE,EAAE,cAAc,CAAC;AACnG,IAAA,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,IAAA,cAAc,EAAE;IAEhB,sBAAsB,GAAGD,qBAAc,CAAC,sBAAsB,EAAEC,oCAAe,CAAC,OAAO,EAAE,cAAc,CAAC;AACxG,IAAA,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAC3B,IAAA,cAAc,EAAE;IAEhB,OAAO,CAAC,cAAc,CAACC,6BAAmB,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,CAAC;IACvF,OAAO,CAAC,cAAc,CAACC,6BAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,CAAC;AACzF;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IApiBaseEntity } from '../../../interface/api-base-entity.interface';
|
|
2
|
+
import type { IApiAuthorizationDecision } from '../../../interface/authorization/index';
|
|
3
|
+
import type { TApiAuthorizationRuleTransformPayload } from '../../../type/class/api/authorization/rule/transform-payload.type';
|
|
4
|
+
/**
|
|
5
|
+
* Applies decision result transforms sequentially to a response payload.
|
|
6
|
+
* @template E - Entity type
|
|
7
|
+
* @template R - Result payload type
|
|
8
|
+
* @param {IApiAuthorizationDecision<E, R> | undefined} decision - Evaluated decision.
|
|
9
|
+
* @param {R} result - Result to transform.
|
|
10
|
+
* @returns {Promise<R>} Transformed payload.
|
|
11
|
+
*/
|
|
12
|
+
export declare function AuthorizationDecisionApplyResult<E extends IApiBaseEntity, R extends TApiAuthorizationRuleTransformPayload<E>>(decision: IApiAuthorizationDecision<E, R> | undefined, result: R): Promise<R>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Applies decision result transforms sequentially to a response payload.
|
|
5
|
+
* @template E - Entity type
|
|
6
|
+
* @template R - Result payload type
|
|
7
|
+
* @param {IApiAuthorizationDecision<E, R> | undefined} decision - Evaluated decision.
|
|
8
|
+
* @param {R} result - Result to transform.
|
|
9
|
+
* @returns {Promise<R>} Transformed payload.
|
|
10
|
+
*/
|
|
11
|
+
async function AuthorizationDecisionApplyResult(decision, result) {
|
|
12
|
+
if (!decision?.transforms.length) {
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
let transformedResult = result;
|
|
16
|
+
const context = {
|
|
17
|
+
resource: decision.resource,
|
|
18
|
+
subject: decision.subject,
|
|
19
|
+
};
|
|
20
|
+
for (const transform of decision.transforms) {
|
|
21
|
+
transformedResult = await transform(transformedResult, context);
|
|
22
|
+
}
|
|
23
|
+
return transformedResult;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
exports.AuthorizationDecisionApplyResult = AuthorizationDecisionApplyResult;
|
|
27
|
+
//# sourceMappingURL=apply-result.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-result.utility.js","sources":["../../../../../../src/utility/authorization/decision/apply-result.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;;;;;AAOG;AACI,eAAe,gCAAgC,CAA+E,QAAqD,EAAE,MAAS,EAAA;AACpM,IAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,EAAE;AACjC,QAAA,OAAO,MAAM;IACd;IAEA,IAAI,iBAAiB,GAAM,MAAM;AAEjC,IAAA,MAAM,OAAO,GAAoC;QAChD,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;KACzB;AAED,IAAA,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE;QAC5C,iBAAiB,GAAG,MAAM,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAChE;AAEA,IAAA,OAAO,iBAAiB;AACzB;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IApiBaseEntity } from '../../../interface/api-base-entity.interface';
|
|
2
|
+
import type { IApiAuthorizationDecision } from '../../../interface/authorization/index';
|
|
3
|
+
/**
|
|
4
|
+
* Mutates authorization decision to include the resolved entity resource.
|
|
5
|
+
* @template E - Entity type
|
|
6
|
+
* @template R - Result payload type
|
|
7
|
+
* @param {IApiAuthorizationDecision<E, R> | undefined} decision - Decision to enrich.
|
|
8
|
+
* @param {E | undefined} resource - Entity instance to attach.
|
|
9
|
+
* @returns {IApiAuthorizationDecision<E, R> | undefined} Updated decision reference.
|
|
10
|
+
*/
|
|
11
|
+
export declare function AuthorizationDecisionAttachResource<E extends IApiBaseEntity, R>(decision: IApiAuthorizationDecision<E, R> | undefined, resource: E | undefined): IApiAuthorizationDecision<E, R> | undefined;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Mutates authorization decision to include the resolved entity resource.
|
|
5
|
+
* @template E - Entity type
|
|
6
|
+
* @template R - Result payload type
|
|
7
|
+
* @param {IApiAuthorizationDecision<E, R> | undefined} decision - Decision to enrich.
|
|
8
|
+
* @param {E | undefined} resource - Entity instance to attach.
|
|
9
|
+
* @returns {IApiAuthorizationDecision<E, R> | undefined} Updated decision reference.
|
|
10
|
+
*/
|
|
11
|
+
function AuthorizationDecisionAttachResource(decision, resource) {
|
|
12
|
+
if (!decision || resource === undefined) {
|
|
13
|
+
return decision;
|
|
14
|
+
}
|
|
15
|
+
decision.resource = resource;
|
|
16
|
+
return decision;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
exports.AuthorizationDecisionAttachResource = AuthorizationDecisionAttachResource;
|
|
20
|
+
//# sourceMappingURL=attach-resource.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach-resource.utility.js","sources":["../../../../../../src/utility/authorization/decision/attach-resource.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA;;;;;;;AAOG;AACG,SAAU,mCAAmC,CAA8B,QAAqD,EAAE,QAAuB,EAAA;AAC9J,IAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE;AACxC,QAAA,OAAO,QAAQ;IAChB;AAEA,IAAA,QAAQ,CAAC,QAAQ,GAAG,QAAQ;AAE5B,IAAA,OAAO,QAAQ;AAChB;;;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IApiAuthenticationRequest } from '../../../interface/api-authentication-request.interface';
|
|
2
|
+
import type { IApiBaseEntity } from '../../../interface/api-base-entity.interface';
|
|
3
|
+
import type { IApiAuthorizationDecision } from '../../../interface/authorization/decision.interface';
|
|
4
|
+
import type { TApiAuthorizationRuleTransformPayload } from '../../../type/class/api/authorization/rule/transform-payload.type';
|
|
5
|
+
/**
|
|
6
|
+
* Extracts an authorization decision from the authentication request metadata stored on the HTTP request.
|
|
7
|
+
* @template E - Entity type
|
|
8
|
+
* @template R - Result payload type
|
|
9
|
+
* @param {IApiAuthenticationRequest} [authenticationRequest] - Request object bound to the route handler.
|
|
10
|
+
* @returns {IApiAuthorizationDecision<E, R> | undefined} Authorization decision if present.
|
|
11
|
+
*/
|
|
12
|
+
export declare function AuthorizationDecisionResolveFromRequest<E extends IApiBaseEntity, R extends TApiAuthorizationRuleTransformPayload<E> = TApiAuthorizationRuleTransformPayload<E>>(authenticationRequest?: IApiAuthenticationRequest): IApiAuthorizationDecision<E, R> | undefined;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var decision_constant = require('../../../constant/authorization/metadata/decision.constant.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Extracts an authorization decision from the authentication request metadata stored on the HTTP request.
|
|
7
|
+
* @template E - Entity type
|
|
8
|
+
* @template R - Result payload type
|
|
9
|
+
* @param {IApiAuthenticationRequest} [authenticationRequest] - Request object bound to the route handler.
|
|
10
|
+
* @returns {IApiAuthorizationDecision<E, R> | undefined} Authorization decision if present.
|
|
11
|
+
*/
|
|
12
|
+
function AuthorizationDecisionResolveFromRequest(authenticationRequest) {
|
|
13
|
+
if (!authenticationRequest) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const requestRecord = authenticationRequest;
|
|
17
|
+
const decision = requestRecord[decision_constant.AUTHORIZATION_DECISION_METADATA_CONSTANT.REQUEST_KEY] ?? requestRecord.authorizationDecision;
|
|
18
|
+
return decision;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
exports.AuthorizationDecisionResolveFromRequest = AuthorizationDecisionResolveFromRequest;
|
|
22
|
+
//# sourceMappingURL=resolve-from-request.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-from-request.utility.js","sources":["../../../../../../src/utility/authorization/decision/resolve-from-request.utility.ts"],"sourcesContent":[null],"names":["AUTHORIZATION_DECISION_METADATA_CONSTANT"],"mappings":";;;;AAOA;;;;;;AAMG;AACG,SAAU,uCAAuC,CAA0H,qBAAiD,EAAA;IACjO,IAAI,CAAC,qBAAqB,EAAE;AAC3B,QAAA,OAAO,SAAS;IACjB;IAEA,MAAM,aAAa,GAA4B,qBAA2D;AAC1G,IAAA,MAAM,QAAQ,GAAY,aAAa,CAACA,0DAAwC,CAAC,WAAW,CAAC,IAAI,aAAa,CAAC,qBAAqB;AAEpI,IAAA,OAAO,QAAuD;AAC/D;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './merge/index';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AuthorizationScopeMergeWhere } from './where.utility';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IApiBaseEntity } from '../../../../interface/api-base-entity.interface';
|
|
2
|
+
import type { TApiAuthorizationScopeWhere } from '../../../../type/class/api/authorization/scope-where.type';
|
|
3
|
+
/**
|
|
4
|
+
* Merges two WHERE expressions by building a Cartesian product of OR branches.
|
|
5
|
+
* @template E - Entity type
|
|
6
|
+
* @param {TApiAuthorizationScopeWhere<E>} baseWhere - Existing filter.
|
|
7
|
+
* @param {TApiAuthorizationScopeWhere<E>} scopedWhere - Additional scope filter.
|
|
8
|
+
* @returns {TApiAuthorizationScopeWhere<E>} Combined filter.
|
|
9
|
+
*/
|
|
10
|
+
export declare function AuthorizationScopeMergeWhere<E extends IApiBaseEntity>(baseWhere: TApiAuthorizationScopeWhere<E>, scopedWhere: TApiAuthorizationScopeWhere<E>): TApiAuthorizationScopeWhere<E>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Merges two WHERE expressions by building a Cartesian product of OR branches.
|
|
5
|
+
* @template E - Entity type
|
|
6
|
+
* @param {TApiAuthorizationScopeWhere<E>} baseWhere - Existing filter.
|
|
7
|
+
* @param {TApiAuthorizationScopeWhere<E>} scopedWhere - Additional scope filter.
|
|
8
|
+
* @returns {TApiAuthorizationScopeWhere<E>} Combined filter.
|
|
9
|
+
*/
|
|
10
|
+
function AuthorizationScopeMergeWhere(baseWhere, scopedWhere) {
|
|
11
|
+
if (!baseWhere) {
|
|
12
|
+
return scopedWhere;
|
|
13
|
+
}
|
|
14
|
+
if (!scopedWhere) {
|
|
15
|
+
return baseWhere;
|
|
16
|
+
}
|
|
17
|
+
const baseVariants = Array.isArray(baseWhere) ? baseWhere : [baseWhere];
|
|
18
|
+
const scopedVariants = Array.isArray(scopedWhere) ? scopedWhere : [scopedWhere];
|
|
19
|
+
const mergedVariants = [];
|
|
20
|
+
for (const baseVariant of baseVariants) {
|
|
21
|
+
for (const scopedVariant of scopedVariants) {
|
|
22
|
+
mergedVariants.push({
|
|
23
|
+
...baseVariant,
|
|
24
|
+
...scopedVariant,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return mergedVariants.length === 1 ? mergedVariants[0] : mergedVariants;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.AuthorizationScopeMergeWhere = AuthorizationScopeMergeWhere;
|
|
32
|
+
//# sourceMappingURL=where.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where.utility.js","sources":["../../../../../../../src/utility/authorization/scope/merge/where.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;;;;;AAMG;AACG,SAAU,4BAA4B,CAA2B,SAAyC,EAAE,WAA2C,EAAA;IAC5J,IAAI,CAAC,SAAS,EAAE;AACf,QAAA,OAAO,WAAW;IACnB;IAEA,IAAI,CAAC,WAAW,EAAE;AACjB,QAAA,OAAO,SAAS;IACjB;AAEA,IAAA,MAAM,YAAY,GAA+B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC;AACnG,IAAA,MAAM,cAAc,GAA+B,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,CAAC,WAAW,CAAC;IAC3G,MAAM,cAAc,GAA+B,EAAE;AAErD,IAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACvC,QAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;YAC3C,cAAc,CAAC,IAAI,CAAC;AACnB,gBAAA,GAAG,WAAW;AACd,gBAAA,GAAG,aAAa;AAChB,aAAA,CAAC;QACH;IACD;AAEA,IAAA,OAAO,cAAc,CAAC,MAAM,KAAK,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc;AACxE;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { AuthorizationResolveDefaultSubject } from './resolve-default-subject.utility';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IApiAuthorizationSubject } from '../../../interface/authorization/subject.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a subject from request.user with smart fallbacks.
|
|
4
|
+
* @param {unknown} user - Request user payload.
|
|
5
|
+
* @returns {IApiAuthorizationSubject} Normalized authorization subject.
|
|
6
|
+
*/
|
|
7
|
+
export declare function AuthorizationResolveDefaultSubject(user: unknown): IApiAuthorizationSubject;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a subject from request.user with smart fallbacks.
|
|
5
|
+
* @param {unknown} user - Request user payload.
|
|
6
|
+
* @returns {IApiAuthorizationSubject} Normalized authorization subject.
|
|
7
|
+
*/
|
|
8
|
+
function AuthorizationResolveDefaultSubject(user) {
|
|
9
|
+
const baseSubject = {
|
|
10
|
+
attributes: {},
|
|
11
|
+
id: "anonymous",
|
|
12
|
+
permissions: [],
|
|
13
|
+
roles: [],
|
|
14
|
+
};
|
|
15
|
+
if (!user || typeof user !== "object") {
|
|
16
|
+
return baseSubject;
|
|
17
|
+
}
|
|
18
|
+
const record = user;
|
|
19
|
+
const idFields = ["id", "uuid", "email"];
|
|
20
|
+
for (const field of idFields) {
|
|
21
|
+
const value = record[field];
|
|
22
|
+
if (typeof value === "string" && value.length > 0) {
|
|
23
|
+
baseSubject.id = value;
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
baseSubject.roles = resolveStringArray(record, ["roles", "role"]);
|
|
28
|
+
baseSubject.permissions = resolveStringArray(record, ["permissions", "permission"]);
|
|
29
|
+
baseSubject.attributes = record;
|
|
30
|
+
return baseSubject;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the first string array found in the provided record for the given field candidates.
|
|
34
|
+
* @param {Record<string, unknown>} record - Object containing candidate fields.
|
|
35
|
+
* @param {Array<string>} fields - Candidate field names to inspect in order.
|
|
36
|
+
* @returns {Array<string>} Normalized array of string values.
|
|
37
|
+
*/
|
|
38
|
+
function resolveStringArray(record, fields) {
|
|
39
|
+
for (const field of fields) {
|
|
40
|
+
const value = record[field];
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
return [value];
|
|
43
|
+
}
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
return value.filter((item) => typeof item === "string");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
exports.AuthorizationResolveDefaultSubject = AuthorizationResolveDefaultSubject;
|
|
52
|
+
//# sourceMappingURL=resolve-default-subject.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-default-subject.utility.js","sources":["../../../../../../src/utility/authorization/subject/resolve-default-subject.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;AAIG;AACG,SAAU,kCAAkC,CAAC,IAAa,EAAA;AAC/D,IAAA,MAAM,WAAW,GAA6B;AAC7C,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,EAAE,EAAE,WAAW;AACf,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,KAAK,EAAE,EAAE;KACT;IAED,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACtC,QAAA,OAAO,WAAW;IACnB;IAEA,MAAM,MAAM,GAA4B,IAA+B;IACvE,MAAM,QAAQ,GAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;AAEvD,IAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC7B,QAAA,MAAM,KAAK,GAAY,MAAM,CAAC,KAAK,CAAC;QAEpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAClD,YAAA,WAAW,CAAC,EAAE,GAAG,KAAK;YAEtB;QACD;IACD;AAEA,IAAA,WAAW,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACjE,IAAA,WAAW,CAAC,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AACnF,IAAA,WAAW,CAAC,UAAU,GAAG,MAAM;AAE/B,IAAA,OAAO,WAAW;AACnB;AAEA;;;;;AAKG;AACH,SAAS,kBAAkB,CAAC,MAA+B,EAAE,MAAqB,EAAA;AACjF,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC3B,QAAA,MAAM,KAAK,GAAY,MAAM,CAAC,KAAK,CAAC;AAEpC,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC;QACf;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,YAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAa,KAAqB,OAAO,IAAI,KAAK,QAAQ,CAAC;QACjF;IACD;AAEA,IAAA,OAAO,EAAE;AACV;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IApiBaseEntity } from '../../../interface/api-base-entity.interface';
|
|
2
|
+
import { IApiAuthorizationDecision, IApiAuthorizationEngine, IApiAuthorizationEngineEvaluateOptions } from '../../../interface/authorization/index';
|
|
3
|
+
export declare class ApiAuthorizationEngine implements IApiAuthorizationEngine<IApiBaseEntity> {
|
|
4
|
+
evaluate<E extends IApiBaseEntity, R>(options: IApiAuthorizationEngineEvaluateOptions<E, R>): Promise<IApiAuthorizationDecision<E, R>>;
|
|
5
|
+
private buildDecision;
|
|
6
|
+
private evaluateCondition;
|
|
7
|
+
private mergeScope;
|
|
8
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { __decorate } from '../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { EAuthorizationEffect } from '../../../enum/authorization/effect.enum.js';
|
|
3
|
+
import { Injectable } from '@nestjs/common';
|
|
4
|
+
import { AuthorizationScopeMergeWhere } from '../../../utility/authorization/scope/merge/where.utility.js';
|
|
5
|
+
|
|
6
|
+
let ApiAuthorizationEngine = class ApiAuthorizationEngine {
|
|
7
|
+
async evaluate(options) {
|
|
8
|
+
const context = {
|
|
9
|
+
resource: options.resource,
|
|
10
|
+
subject: options.subject,
|
|
11
|
+
};
|
|
12
|
+
const matchedRules = [];
|
|
13
|
+
let scope;
|
|
14
|
+
const transforms = [];
|
|
15
|
+
for (const rule of options.policy.rules) {
|
|
16
|
+
const isConditionPassed = await this.evaluateCondition(rule, context);
|
|
17
|
+
if (!isConditionPassed) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (rule.effect === EAuthorizationEffect.DENY) {
|
|
21
|
+
return this.buildDecision(options, {
|
|
22
|
+
appliedRules: [rule],
|
|
23
|
+
effect: EAuthorizationEffect.DENY,
|
|
24
|
+
scope: undefined,
|
|
25
|
+
transforms: [],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
matchedRules.push(rule);
|
|
29
|
+
scope = await this.mergeScope(scope, rule, context);
|
|
30
|
+
if (rule.resultTransform) {
|
|
31
|
+
transforms.push(rule.resultTransform);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (matchedRules.length === 0) {
|
|
35
|
+
return this.buildDecision(options, {
|
|
36
|
+
appliedRules: [],
|
|
37
|
+
effect: EAuthorizationEffect.DENY,
|
|
38
|
+
scope: undefined,
|
|
39
|
+
transforms: [],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return this.buildDecision(options, {
|
|
43
|
+
appliedRules: matchedRules,
|
|
44
|
+
effect: EAuthorizationEffect.ALLOW,
|
|
45
|
+
scope,
|
|
46
|
+
transforms,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
buildDecision(options, payload) {
|
|
50
|
+
return {
|
|
51
|
+
action: options.action,
|
|
52
|
+
appliedRules: payload.appliedRules,
|
|
53
|
+
effect: payload.effect,
|
|
54
|
+
policyId: options.policy.policyId,
|
|
55
|
+
resource: options.resource,
|
|
56
|
+
resourceType: options.policy.entity.name ?? "UnknownResource",
|
|
57
|
+
scope: payload.scope,
|
|
58
|
+
subject: options.subject,
|
|
59
|
+
transforms: payload.transforms,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async evaluateCondition(rule, context) {
|
|
63
|
+
if (!rule.condition) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const result = await rule.condition(context);
|
|
67
|
+
return result === true;
|
|
68
|
+
}
|
|
69
|
+
async mergeScope(currentScope, rule, context) {
|
|
70
|
+
if (!rule.scope) {
|
|
71
|
+
return currentScope;
|
|
72
|
+
}
|
|
73
|
+
const scopePatch = await rule.scope(context);
|
|
74
|
+
if (!scopePatch) {
|
|
75
|
+
return currentScope;
|
|
76
|
+
}
|
|
77
|
+
if (!currentScope) {
|
|
78
|
+
return scopePatch;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
...currentScope,
|
|
82
|
+
...scopePatch,
|
|
83
|
+
where: AuthorizationScopeMergeWhere(currentScope.where, scopePatch.where),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
ApiAuthorizationEngine = __decorate([
|
|
88
|
+
Injectable()
|
|
89
|
+
], ApiAuthorizationEngine);
|
|
90
|
+
|
|
91
|
+
export { ApiAuthorizationEngine };
|
|
92
|
+
//# sourceMappingURL=engine.class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.class.js","sources":["../../../../../../src/class/api/authorization/engine.class.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IApiAuthorizationPolicyRegistry } from '../../../interface/authorization/policy/registry.interface';
|
|
2
|
+
import { ApiAuthorizationEngine } from './engine.class';
|
|
3
|
+
import { CanActivate, ExecutionContext } from "@nestjs/common";
|
|
4
|
+
export declare class ApiAuthorizationGuard implements CanActivate {
|
|
5
|
+
private readonly policyRegistry;
|
|
6
|
+
private readonly authorizationEngine;
|
|
7
|
+
constructor(policyRegistry: IApiAuthorizationPolicyRegistry, authorizationEngine: ApiAuthorizationEngine);
|
|
8
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
9
|
+
private attachDecisionToRequest;
|
|
10
|
+
private isControllerSecurable;
|
|
11
|
+
private resolveAction;
|
|
12
|
+
private resolveEntityConstructor;
|
|
13
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { __decorate, __param, __metadata } from '../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { ApiAuthorizationEngine } from './engine.class.js';
|
|
3
|
+
import { AUTHORIZATION_DECISION_METADATA_CONSTANT } from '../../../constant/authorization/metadata/decision.constant.js';
|
|
4
|
+
import { AUTHORIZATION_POLICY_REGISTRY_TOKEN } from '../../../constant/authorization/token/registry.constant.js';
|
|
5
|
+
import { CONTROLLER_API_DECORATOR_CONSTANT } from '../../../constant/decorator/api/controller.constant.js';
|
|
6
|
+
import { EAuthorizationEffect } from '../../../enum/authorization/effect.enum.js';
|
|
7
|
+
import { Injectable, Inject, ForbiddenException } from '@nestjs/common';
|
|
8
|
+
import { AuthorizationResolveDefaultSubject } from '../../../utility/authorization/subject/resolve-default-subject.utility.js';
|
|
9
|
+
import { LoggerUtility } from '../../../utility/logger.utility.js';
|
|
10
|
+
|
|
11
|
+
const authorizationGuardLogger = LoggerUtility.getLogger("ApiAuthorizationGuard");
|
|
12
|
+
let ApiAuthorizationGuard = class ApiAuthorizationGuard {
|
|
13
|
+
policyRegistry;
|
|
14
|
+
authorizationEngine;
|
|
15
|
+
constructor(policyRegistry, authorizationEngine) {
|
|
16
|
+
this.policyRegistry = policyRegistry;
|
|
17
|
+
this.authorizationEngine = authorizationEngine;
|
|
18
|
+
}
|
|
19
|
+
async canActivate(context) {
|
|
20
|
+
if (!this.isControllerSecurable(context)) {
|
|
21
|
+
authorizationGuardLogger.debug("Controller is not marked as @ApiControllerSecurable, skipping authorization");
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
const entityConstructor = this.resolveEntityConstructor(context);
|
|
25
|
+
if (!entityConstructor) {
|
|
26
|
+
authorizationGuardLogger.debug("No entity constructor found in controller metadata, skipping authorization");
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
const action = this.resolveAction(context);
|
|
30
|
+
authorizationGuardLogger.verbose(`Evaluating authorization for entity "${entityConstructor.name}" action "${action}"`);
|
|
31
|
+
const policy = await this.policyRegistry.buildAggregatedPolicy(entityConstructor, action);
|
|
32
|
+
if (!policy) {
|
|
33
|
+
authorizationGuardLogger.debug(`No policy found for entity "${entityConstructor.name}" action "${action}", allowing access`);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
authorizationGuardLogger.verbose(`Found policy "${policy.policyId}" with ${policy.rules.length} rules for entity "${entityConstructor.name}" action "${action}"`);
|
|
37
|
+
const request = context.switchToHttp().getRequest();
|
|
38
|
+
const subject = AuthorizationResolveDefaultSubject(request.user);
|
|
39
|
+
const decision = await this.authorizationEngine.evaluate({
|
|
40
|
+
action,
|
|
41
|
+
policy,
|
|
42
|
+
resource: undefined,
|
|
43
|
+
subject,
|
|
44
|
+
});
|
|
45
|
+
this.attachDecisionToRequest(request, decision);
|
|
46
|
+
if (decision.effect === EAuthorizationEffect.DENY) {
|
|
47
|
+
authorizationGuardLogger.warn(`Access denied for entity "${entityConstructor.name}" action "${action}" subject "${subject.id}"`);
|
|
48
|
+
throw new ForbiddenException("Access denied");
|
|
49
|
+
}
|
|
50
|
+
authorizationGuardLogger.verbose(`Access granted for entity "${entityConstructor.name}" action "${action}" subject "${subject.id}"`);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
attachDecisionToRequest(request, decision) {
|
|
54
|
+
request.authorizationDecision = decision;
|
|
55
|
+
request[AUTHORIZATION_DECISION_METADATA_CONSTANT.REQUEST_KEY] = decision;
|
|
56
|
+
}
|
|
57
|
+
isControllerSecurable(context) {
|
|
58
|
+
return Boolean(Reflect.getMetadata(CONTROLLER_API_DECORATOR_CONSTANT.SECURABLE_METADATA_KEY, context.getClass()));
|
|
59
|
+
}
|
|
60
|
+
resolveAction(context) {
|
|
61
|
+
const handlerName = context.getHandler().name;
|
|
62
|
+
const prefix = CONTROLLER_API_DECORATOR_CONSTANT.RESERVED_METHOD_PREFIX ?? "";
|
|
63
|
+
if (handlerName.startsWith(prefix)) {
|
|
64
|
+
return handlerName.slice(prefix.length);
|
|
65
|
+
}
|
|
66
|
+
return handlerName;
|
|
67
|
+
}
|
|
68
|
+
resolveEntityConstructor(context) {
|
|
69
|
+
return Reflect.getMetadata(CONTROLLER_API_DECORATOR_CONSTANT.ENTITY_METADATA_KEY, context.getClass());
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
ApiAuthorizationGuard = __decorate([
|
|
73
|
+
Injectable(),
|
|
74
|
+
__param(0, Inject(AUTHORIZATION_POLICY_REGISTRY_TOKEN)),
|
|
75
|
+
__metadata("design:paramtypes", [Object, ApiAuthorizationEngine])
|
|
76
|
+
], ApiAuthorizationGuard);
|
|
77
|
+
|
|
78
|
+
export { ApiAuthorizationGuard };
|
|
79
|
+
//# sourceMappingURL=guard.class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.class.js","sources":["../../../../../../src/class/api/authorization/guard.class.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { IApiBaseEntity } from '../../../../interface/api-base-entity.interface';
|
|
2
|
+
import type { IApiAuthorizationPolicySubscriberRule } from '../../../../interface/authorization/policy/subscriber/index';
|
|
3
|
+
import { ApiSubscriberBase } from '../../subscriber/base.class';
|
|
4
|
+
/**
|
|
5
|
+
* Base class for all authorization policies. It mirrors ApiFunctionSubscriberBase
|
|
6
|
+
* and provides helper methods to create allow/deny rules that are later executed by the policy executor.
|
|
7
|
+
* @template E - Entity type extending IApiBaseEntity
|
|
8
|
+
*/
|
|
9
|
+
export declare abstract class ApiAuthorizationPolicyBase<E extends IApiBaseEntity> extends ApiSubscriberBase {
|
|
10
|
+
/**
|
|
11
|
+
* Creates an ALLOW rule with optional overrides.
|
|
12
|
+
* @param {Omit<IApiAuthorizationPolicySubscriberRule<E>, "effect">} [rule] - Rule fields to merge.
|
|
13
|
+
* @returns {IApiAuthorizationPolicySubscriberRule<E>} Allow rule.
|
|
14
|
+
*/
|
|
15
|
+
protected allow<R>(rule?: Omit<IApiAuthorizationPolicySubscriberRule<E, R>, "effect">): IApiAuthorizationPolicySubscriberRule<E, R>;
|
|
16
|
+
/**
|
|
17
|
+
* Helper that creates an allow rule conditioned on the subject having at least one of the provided roles.
|
|
18
|
+
* @param {Array<string>} roles - Roles that grant access.
|
|
19
|
+
* @param {Omit<IApiAuthorizationPolicySubscriberRule<E>, "effect">} [rule] - Optional overrides.
|
|
20
|
+
* @returns {IApiAuthorizationPolicySubscriberRule<E>} Allow rule targeting the given roles.
|
|
21
|
+
*/
|
|
22
|
+
protected allowForRoles<R>(roles: Array<string>, rule?: Omit<IApiAuthorizationPolicySubscriberRule<E, R>, "effect">): IApiAuthorizationPolicySubscriberRule<E, R>;
|
|
23
|
+
/**
|
|
24
|
+
* Creates a DENY rule with optional overrides.
|
|
25
|
+
* @param {Omit<IApiAuthorizationPolicySubscriberRule<E>, "effect">} [rule] - Rule fields to merge.
|
|
26
|
+
* @returns {IApiAuthorizationPolicySubscriberRule<E>} Deny rule.
|
|
27
|
+
*/
|
|
28
|
+
protected deny<R>(rule?: Omit<IApiAuthorizationPolicySubscriberRule<E, R>, "effect">): IApiAuthorizationPolicySubscriberRule<E, R>;
|
|
29
|
+
/**
|
|
30
|
+
* Helper that scopes data access to the owner identified by a field.
|
|
31
|
+
* Automatically handles relations by using nested id structure.
|
|
32
|
+
* @param {keyof E} [ownerField] - Entity field used to match the subject id, defaults to ownerId.
|
|
33
|
+
* @param {Omit<IApiAuthorizationPolicySubscriberRule<E>, "effect">} [rule] - Optional overrides.
|
|
34
|
+
* @returns {IApiAuthorizationPolicySubscriberRule<E>} Allow rule with owner scope.
|
|
35
|
+
*/
|
|
36
|
+
protected scopeToOwner<R>(ownerField?: keyof E, rule?: Omit<IApiAuthorizationPolicySubscriberRule<E, R>, "effect">): IApiAuthorizationPolicySubscriberRule<E, R>;
|
|
37
|
+
}
|