@carlonicora/nestjs-neo4jsonapi 6.6.2 → 6.7.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/dist/agents/operator/controllers/operator.controller.d.ts.map +1 -1
- package/dist/agents/operator/controllers/operator.controller.js +3 -0
- package/dist/agents/operator/controllers/operator.controller.js.map +1 -1
- package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
- package/dist/bootstrap/app.module.factory.js +9 -0
- package/dist/bootstrap/app.module.factory.js.map +1 -1
- package/dist/bootstrap/bootstrap.options.d.ts +19 -0
- package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
- package/dist/common/constants/core-module.ids.d.ts +39 -0
- package/dist/common/constants/core-module.ids.d.ts.map +1 -0
- package/dist/common/constants/core-module.ids.js +41 -0
- package/dist/common/constants/core-module.ids.js.map +1 -0
- package/dist/common/decorators/module.decorator.d.ts +19 -0
- package/dist/common/decorators/module.decorator.d.ts.map +1 -1
- package/dist/common/decorators/module.decorator.js +8 -2
- package/dist/common/decorators/module.decorator.js.map +1 -1
- package/dist/common/guards/jwt.auth.admin.guard.d.ts +3 -1
- package/dist/common/guards/jwt.auth.admin.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.admin.guard.js +8 -2
- package/dist/common/guards/jwt.auth.admin.guard.js.map +1 -1
- package/dist/common/guards/jwt.auth.guard.d.ts +3 -1
- package/dist/common/guards/jwt.auth.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.guard.js +8 -2
- package/dist/common/guards/jwt.auth.guard.js.map +1 -1
- package/dist/common/guards/jwt.auth.optional.guard.d.ts +3 -1
- package/dist/common/guards/jwt.auth.optional.guard.d.ts.map +1 -1
- package/dist/common/guards/jwt.auth.optional.guard.js +12 -3
- package/dist/common/guards/jwt.auth.optional.guard.js.map +1 -1
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +1 -0
- package/dist/common/index.js.map +1 -1
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.d.ts.map +1 -1
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.js +4 -0
- package/dist/foundations/ai-connection/controllers/ai-connection.controller.js.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.admin.controller.d.ts.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.admin.controller.js +3 -0
- package/dist/foundations/analytics/controllers/analytics.admin.controller.js.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.controller.d.ts.map +1 -1
- package/dist/foundations/analytics/controllers/analytics.controller.js +3 -0
- package/dist/foundations/analytics/controllers/analytics.controller.js.map +1 -1
- package/dist/foundations/assistant/controllers/assistant.controller.d.ts.map +1 -1
- package/dist/foundations/assistant/controllers/assistant.controller.js +3 -0
- package/dist/foundations/assistant/controllers/assistant.controller.js.map +1 -1
- package/dist/foundations/assistant-action/controllers/assistant-action.controller.d.ts.map +1 -1
- package/dist/foundations/assistant-action/controllers/assistant-action.controller.js +3 -0
- package/dist/foundations/assistant-action/controllers/assistant-action.controller.js.map +1 -1
- package/dist/foundations/assistant-message/controllers/assistant-message.controller.d.ts.map +1 -1
- package/dist/foundations/assistant-message/controllers/assistant-message.controller.js +3 -0
- package/dist/foundations/assistant-message/controllers/assistant-message.controller.js.map +1 -1
- package/dist/foundations/audit/controllers/audit.controller.d.ts.map +1 -1
- package/dist/foundations/audit/controllers/audit.controller.js +3 -0
- package/dist/foundations/audit/controllers/audit.controller.js.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.js +3 -0
- package/dist/foundations/auth/controllers/auth.controller.js.map +1 -1
- package/dist/foundations/chunk/controllers/chunk.controller.d.ts.map +1 -1
- package/dist/foundations/chunk/controllers/chunk.controller.js +3 -0
- package/dist/foundations/chunk/controllers/chunk.controller.js.map +1 -1
- package/dist/foundations/company/controllers/company.controller.d.ts.map +1 -1
- package/dist/foundations/company/controllers/company.controller.js +3 -0
- package/dist/foundations/company/controllers/company.controller.js.map +1 -1
- package/dist/foundations/content/controllers/content.controller.d.ts.map +1 -1
- package/dist/foundations/content/controllers/content.controller.js +3 -0
- package/dist/foundations/content/controllers/content.controller.js.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.d.ts.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.js +3 -0
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.js.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation.controller.d.ts.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation.controller.js +3 -0
- package/dist/foundations/email-automation/controllers/email-automation.controller.js.map +1 -1
- package/dist/foundations/feature/controllers/feature.controller.d.ts.map +1 -1
- package/dist/foundations/feature/controllers/feature.controller.js +3 -0
- package/dist/foundations/feature/controllers/feature.controller.js.map +1 -1
- package/dist/foundations/handbook/controllers/handbook-thread.controller.d.ts.map +1 -1
- package/dist/foundations/handbook/controllers/handbook-thread.controller.js +3 -0
- package/dist/foundations/handbook/controllers/handbook-thread.controller.js.map +1 -1
- package/dist/foundations/handbook/controllers/handbook.controller.d.ts.map +1 -1
- package/dist/foundations/handbook/controllers/handbook.controller.js +3 -0
- package/dist/foundations/handbook/controllers/handbook.controller.js.map +1 -1
- package/dist/foundations/how-to/controllers/how-to.controller.d.ts.map +1 -1
- package/dist/foundations/how-to/controllers/how-to.controller.js +3 -0
- package/dist/foundations/how-to/controllers/how-to.controller.js.map +1 -1
- package/dist/foundations/keyconcept/controllers/keyconcept.controller.d.ts.map +1 -1
- package/dist/foundations/keyconcept/controllers/keyconcept.controller.js +3 -0
- package/dist/foundations/keyconcept/controllers/keyconcept.controller.js.map +1 -1
- package/dist/foundations/notification/controllers/notification.controller.d.ts.map +1 -1
- package/dist/foundations/notification/controllers/notification.controller.js +4 -0
- package/dist/foundations/notification/controllers/notification.controller.js.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.authorize.controller.d.ts.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.authorize.controller.js +4 -0
- package/dist/foundations/oauth/controllers/oauth.authorize.controller.js.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.management.controller.d.ts.map +1 -1
- package/dist/foundations/oauth/controllers/oauth.management.controller.js +3 -0
- package/dist/foundations/oauth/controllers/oauth.management.controller.js.map +1 -1
- package/dist/foundations/push/controllers/push.controller.d.ts.map +1 -1
- package/dist/foundations/push/controllers/push.controller.js +3 -0
- package/dist/foundations/push/controllers/push.controller.js.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-dev.controller.d.ts.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-dev.controller.js +3 -0
- package/dist/foundations/rbac/controllers/rbac-dev.controller.js.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-module-paths.controller.d.ts.map +1 -1
- package/dist/foundations/rbac/controllers/rbac-module-paths.controller.js +3 -0
- package/dist/foundations/rbac/controllers/rbac-module-paths.controller.js.map +1 -1
- package/dist/foundations/rbac/controllers/rbac.controller.d.ts.map +1 -1
- package/dist/foundations/rbac/controllers/rbac.controller.js +3 -0
- package/dist/foundations/rbac/controllers/rbac.controller.js.map +1 -1
- package/dist/foundations/rbac/index.d.ts +5 -0
- package/dist/foundations/rbac/index.d.ts.map +1 -1
- package/dist/foundations/rbac/index.js +12 -1
- package/dist/foundations/rbac/index.js.map +1 -1
- package/dist/foundations/rbac/rbac-permission.module.d.ts +4 -0
- package/dist/foundations/rbac/rbac-permission.module.d.ts.map +1 -1
- package/dist/foundations/rbac/rbac-permission.module.js +18 -2
- package/dist/foundations/rbac/rbac-permission.module.js.map +1 -1
- package/dist/foundations/rbac/rbac.tokens.d.ts +8 -0
- package/dist/foundations/rbac/rbac.tokens.d.ts.map +1 -1
- package/dist/foundations/rbac/rbac.tokens.js +9 -1
- package/dist/foundations/rbac/rbac.tokens.js.map +1 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.d.ts +29 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.d.ts.map +1 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.js +73 -1
- package/dist/foundations/rbac/repositories/rbac-permission.repository.js.map +1 -1
- package/dist/foundations/rbac/services/module-permission-audit.service.d.ts +34 -0
- package/dist/foundations/rbac/services/module-permission-audit.service.d.ts.map +1 -0
- package/dist/foundations/rbac/services/module-permission-audit.service.js +137 -0
- package/dist/foundations/rbac/services/module-permission-audit.service.js.map +1 -0
- package/dist/foundations/rbac/services/module-permission.gate.d.ts +51 -0
- package/dist/foundations/rbac/services/module-permission.gate.d.ts.map +1 -0
- package/dist/foundations/rbac/services/module-permission.gate.js +108 -0
- package/dist/foundations/rbac/services/module-permission.gate.js.map +1 -0
- package/dist/foundations/rbac/services/module-permission.service.d.ts +34 -0
- package/dist/foundations/rbac/services/module-permission.service.d.ts.map +1 -0
- package/dist/foundations/rbac/services/module-permission.service.js +64 -0
- package/dist/foundations/rbac/services/module-permission.service.js.map +1 -0
- package/dist/foundations/rbac/services/rbac-permission.service.d.ts +10 -1
- package/dist/foundations/rbac/services/rbac-permission.service.d.ts.map +1 -1
- package/dist/foundations/rbac/services/rbac-permission.service.js +32 -2
- package/dist/foundations/rbac/services/rbac-permission.service.js.map +1 -1
- package/dist/foundations/rbac/services/rbac-reconciler.service.d.ts +11 -2
- package/dist/foundations/rbac/services/rbac-reconciler.service.d.ts.map +1 -1
- package/dist/foundations/rbac/services/rbac-reconciler.service.js +19 -6
- package/dist/foundations/rbac/services/rbac-reconciler.service.js.map +1 -1
- package/dist/foundations/referral/controllers/referral.controller.d.ts.map +1 -1
- package/dist/foundations/referral/controllers/referral.controller.js +3 -0
- package/dist/foundations/referral/controllers/referral.controller.js.map +1 -1
- package/dist/foundations/role/controllers/role.controller.d.ts.map +1 -1
- package/dist/foundations/role/controllers/role.controller.js +3 -0
- package/dist/foundations/role/controllers/role.controller.js.map +1 -1
- package/dist/foundations/role/controllers/role.user.controller.d.ts.map +1 -1
- package/dist/foundations/role/controllers/role.user.controller.js +3 -0
- package/dist/foundations/role/controllers/role.user.controller.js.map +1 -1
- package/dist/foundations/s3/controllers/s3.controller.d.ts.map +1 -1
- package/dist/foundations/s3/controllers/s3.controller.js +3 -0
- package/dist/foundations/s3/controllers/s3.controller.js.map +1 -1
- package/dist/foundations/stripe/controllers/billing.controller.d.ts.map +1 -1
- package/dist/foundations/stripe/controllers/billing.controller.js +4 -0
- package/dist/foundations/stripe/controllers/billing.controller.js.map +1 -1
- package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.js +3 -0
- package/dist/foundations/stripe-customer/controllers/stripe-customer.controller.js.map +1 -1
- package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.js +3 -0
- package/dist/foundations/stripe-invoice/controllers/stripe-invoice.controller.js.map +1 -1
- package/dist/foundations/stripe-price/controllers/stripe-price.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-price/controllers/stripe-price.controller.js +3 -0
- package/dist/foundations/stripe-price/controllers/stripe-price.controller.js.map +1 -1
- package/dist/foundations/stripe-product/controllers/stripe-product.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-product/controllers/stripe-product.controller.js +3 -0
- package/dist/foundations/stripe-product/controllers/stripe-product.controller.js.map +1 -1
- package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.js +4 -0
- package/dist/foundations/stripe-promotion-code/controllers/stripe-promotion-code.controller.js.map +1 -1
- package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js +3 -0
- package/dist/foundations/stripe-subscription/controllers/stripe-subscription.controller.js.map +1 -1
- package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.d.ts.map +1 -1
- package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.js +3 -0
- package/dist/foundations/stripe-usage/controllers/stripe-usage.controller.js.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.d.ts.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js +3 -0
- package/dist/foundations/tokenusage/controllers/tokenusage.admin.controller.js.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.d.ts.map +1 -1
- package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js +3 -0
- package/dist/foundations/tokenusage/controllers/tokenusage.report.controller.js.map +1 -1
- package/dist/foundations/two-factor/controllers/passkey.controller.d.ts.map +1 -1
- package/dist/foundations/two-factor/controllers/passkey.controller.js +7 -0
- package/dist/foundations/two-factor/controllers/passkey.controller.js.map +1 -1
- package/dist/foundations/two-factor/controllers/totp.controller.d.ts.map +1 -1
- package/dist/foundations/two-factor/controllers/totp.controller.js +6 -0
- package/dist/foundations/two-factor/controllers/totp.controller.js.map +1 -1
- package/dist/foundations/two-factor/controllers/two-factor.controller.d.ts.map +1 -1
- package/dist/foundations/two-factor/controllers/two-factor.controller.js +7 -0
- package/dist/foundations/two-factor/controllers/two-factor.controller.js.map +1 -1
- package/dist/foundations/user/controllers/user.controller.d.ts.map +1 -1
- package/dist/foundations/user/controllers/user.controller.js +3 -0
- package/dist/foundations/user/controllers/user.controller.js.map +1 -1
- package/dist/foundations/waitlist/controllers/waitlist.controller.d.ts.map +1 -1
- package/dist/foundations/waitlist/controllers/waitlist.controller.js +3 -0
- package/dist/foundations/waitlist/controllers/waitlist.controller.js.map +1 -1
- package/package.json +1 -1
|
@@ -17,6 +17,8 @@ const roles_decorator_1 = require("../../../common/decorators/roles.decorator");
|
|
|
17
17
|
const system_roles_1 = require("../../../common/constants/system.roles");
|
|
18
18
|
const rbac_service_1 = require("../services/rbac.service");
|
|
19
19
|
const permission_mapping_meta_1 = require("../entities/permission-mapping.meta");
|
|
20
|
+
const module_decorator_1 = require("../../../common/decorators/module.decorator");
|
|
21
|
+
const core_module_ids_1 = require("../../../common/constants/core-module.ids");
|
|
20
22
|
let RbacController = class RbacController {
|
|
21
23
|
constructor(rbacService) {
|
|
22
24
|
this.rbacService = rbacService;
|
|
@@ -35,6 +37,7 @@ __decorate([
|
|
|
35
37
|
__metadata("design:returntype", Promise)
|
|
36
38
|
], RbacController.prototype, "findPermissionMappings", null);
|
|
37
39
|
exports.RbacController = RbacController = __decorate([
|
|
40
|
+
(0, module_decorator_1.ModuleACL)({ module: core_module_ids_1.CoreModuleId.Role }),
|
|
38
41
|
(0, common_1.Controller)(permission_mapping_meta_1.permissionMappingMeta.endpoint),
|
|
39
42
|
__metadata("design:paramtypes", [rbac_service_1.RbacService])
|
|
40
43
|
], RbacController);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac.controller.js","sourceRoot":"","sources":["../../../../src/foundations/rbac/controllers/rbac.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAC5D,sFAAgF;AAChF,0EAAqE;AACrE,gFAAmE;AACnE,yEAAgE;AAChE,2DAAuD;AACvD,iFAA4E;
|
|
1
|
+
{"version":3,"file":"rbac.controller.js","sourceRoot":"","sources":["../../../../src/foundations/rbac/controllers/rbac.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAC5D,sFAAgF;AAChF,0EAAqE;AACrE,gFAAmE;AACnE,yEAAgE;AAChE,2DAAuD;AACvD,iFAA4E;AAC5E,kFAAwE;AACxE,+EAAyE;AAIlE,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAKnD,AAAN,KAAK,CAAC,sBAAsB;QAC1B,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,EAAE,CAAC;IACzD,CAAC;CACF,CAAA;AATY,wCAAc;AAMnB;IAHL,IAAA,kBAAS,EAAC,wCAAiB,EAAE,6BAAY,CAAC;IAC1C,IAAA,YAAG,GAAE;IACL,IAAA,uBAAK,EAAC,qBAAM,CAAC,aAAa,CAAC;;;;4DAG3B;yBARU,cAAc;IAF1B,IAAA,4BAAS,EAAC,EAAE,MAAM,EAAE,8BAAY,CAAC,IAAI,EAAE,CAAC;IACxC,IAAA,mBAAU,EAAC,+CAAqB,CAAC,QAAQ,CAAC;qCAEC,0BAAW;GAD1C,cAAc,CAS1B"}
|
|
@@ -4,6 +4,11 @@ export { RbacPermissionService } from "./services/rbac-permission.service";
|
|
|
4
4
|
export type { RbacAction } from "./services/rbac-permission.service";
|
|
5
5
|
export { RbacPermissionRepository } from "./repositories/rbac-permission.repository";
|
|
6
6
|
export { MODULE_USER_PATHS_TOKEN } from "./rbac.constants";
|
|
7
|
+
export { PERMISSIONS_ENFORCE } from "./rbac.tokens";
|
|
8
|
+
export { ModulePermissionService } from "./services/module-permission.service";
|
|
9
|
+
export type { EffectivePermissions } from "./services/module-permission.service";
|
|
10
|
+
export { ModulePermissionGate, rbacActionForHttpMethod, resolveRouteAcl } from "./services/module-permission.gate";
|
|
11
|
+
export { ModulePermissionAuditService } from "./services/module-permission-audit.service";
|
|
7
12
|
export { permissionMappingMeta } from "./entities/permission-mapping.meta";
|
|
8
13
|
export { modulePathsMeta } from "./entities/module-paths.meta";
|
|
9
14
|
export type { PermissionMapping } from "./entities/permission-mapping.entity";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/foundations/rbac/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,YAAY,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,YAAY,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI9E,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAKrF,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/foundations/rbac/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,YAAY,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACnH,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,YAAY,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI9E,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAKrF,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.dumpRbacMatrix = exports.ACTION_ORDER = exports.iterateDeclaredModules = exports.iterateDeclaredEdges = exports.resolveDefault = exports.resolveForRole = exports.toPermissionsJson = exports.defineRbac = exports.perm = exports.modulePathsMeta = exports.permissionMappingMeta = exports.MODULE_USER_PATHS_TOKEN = exports.RbacPermissionRepository = exports.RbacPermissionService = exports.RbacPermissionModule = exports.RbacModule = void 0;
|
|
3
|
+
exports.dumpRbacMatrix = exports.ACTION_ORDER = exports.iterateDeclaredModules = exports.iterateDeclaredEdges = exports.resolveDefault = exports.resolveForRole = exports.toPermissionsJson = exports.defineRbac = exports.perm = exports.modulePathsMeta = exports.permissionMappingMeta = exports.ModulePermissionAuditService = exports.resolveRouteAcl = exports.rbacActionForHttpMethod = exports.ModulePermissionGate = exports.ModulePermissionService = exports.PERMISSIONS_ENFORCE = exports.MODULE_USER_PATHS_TOKEN = exports.RbacPermissionRepository = exports.RbacPermissionService = exports.RbacPermissionModule = exports.RbacModule = void 0;
|
|
4
4
|
var rbac_module_1 = require("./rbac.module");
|
|
5
5
|
Object.defineProperty(exports, "RbacModule", { enumerable: true, get: function () { return rbac_module_1.RbacModule; } });
|
|
6
6
|
var rbac_permission_module_1 = require("./rbac-permission.module");
|
|
@@ -11,6 +11,17 @@ var rbac_permission_repository_1 = require("./repositories/rbac-permission.repos
|
|
|
11
11
|
Object.defineProperty(exports, "RbacPermissionRepository", { enumerable: true, get: function () { return rbac_permission_repository_1.RbacPermissionRepository; } });
|
|
12
12
|
var rbac_constants_1 = require("./rbac.constants");
|
|
13
13
|
Object.defineProperty(exports, "MODULE_USER_PATHS_TOKEN", { enumerable: true, get: function () { return rbac_constants_1.MODULE_USER_PATHS_TOKEN; } });
|
|
14
|
+
var rbac_tokens_1 = require("./rbac.tokens");
|
|
15
|
+
Object.defineProperty(exports, "PERMISSIONS_ENFORCE", { enumerable: true, get: function () { return rbac_tokens_1.PERMISSIONS_ENFORCE; } });
|
|
16
|
+
// Request permission gate (bootstrap option `permissions: { enforce: true }`).
|
|
17
|
+
var module_permission_service_1 = require("./services/module-permission.service");
|
|
18
|
+
Object.defineProperty(exports, "ModulePermissionService", { enumerable: true, get: function () { return module_permission_service_1.ModulePermissionService; } });
|
|
19
|
+
var module_permission_gate_1 = require("./services/module-permission.gate");
|
|
20
|
+
Object.defineProperty(exports, "ModulePermissionGate", { enumerable: true, get: function () { return module_permission_gate_1.ModulePermissionGate; } });
|
|
21
|
+
Object.defineProperty(exports, "rbacActionForHttpMethod", { enumerable: true, get: function () { return module_permission_gate_1.rbacActionForHttpMethod; } });
|
|
22
|
+
Object.defineProperty(exports, "resolveRouteAcl", { enumerable: true, get: function () { return module_permission_gate_1.resolveRouteAcl; } });
|
|
23
|
+
var module_permission_audit_service_1 = require("./services/module-permission-audit.service");
|
|
24
|
+
Object.defineProperty(exports, "ModulePermissionAuditService", { enumerable: true, get: function () { return module_permission_audit_service_1.ModulePermissionAuditService; } });
|
|
14
25
|
var permission_mapping_meta_1 = require("./entities/permission-mapping.meta");
|
|
15
26
|
Object.defineProperty(exports, "permissionMappingMeta", { enumerable: true, get: function () { return permission_mapping_meta_1.permissionMappingMeta; } });
|
|
16
27
|
var module_paths_meta_1 = require("./entities/module-paths.meta");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/foundations/rbac/index.ts"],"names":[],"mappings":";;;AAAA,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mEAAgE;AAAvD,8HAAA,oBAAoB,OAAA;AAC7B,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAE9B,wFAAqF;AAA5E,sIAAA,wBAAwB,OAAA;AACjC,mDAA2D;AAAlD,yHAAA,uBAAuB,OAAA;AAChC,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAC9B,kEAA+D;AAAtD,oHAAA,eAAe,OAAA;AAIxB,mEAAmE;AACnE,gDAAgD;AAChD,6BAA4D;AAAnD,2FAAA,IAAI,OAAA;AAAE,iGAAA,UAAU,OAAA;AAAE,wGAAA,iBAAiB,OAAA;AAC5C,6BAAqG;AAA5F,qGAAA,cAAc,OAAA;AAAE,qGAAA,cAAc,OAAA;AAAE,2GAAA,oBAAoB,OAAA;AAAE,6GAAA,sBAAsB,OAAA;AACrF,6BAAqC;AAA5B,mGAAA,YAAY,OAAA;AAGrB,uEAAuE;AACvE,yEAAyE;AACzE,yDAAyD;AACzD,+BAAwC;AAA/B,sGAAA,cAAc,OAAA;AAEvB,iFAAiF;AACjF,8EAA8E;AAC9E,qEAAqE;AACrE,oEAAoE"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/foundations/rbac/index.ts"],"names":[],"mappings":";;;AAAA,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mEAAgE;AAAvD,8HAAA,oBAAoB,OAAA;AAC7B,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAE9B,wFAAqF;AAA5E,sIAAA,wBAAwB,OAAA;AACjC,mDAA2D;AAAlD,yHAAA,uBAAuB,OAAA;AAChC,6CAAoD;AAA3C,kHAAA,mBAAmB,OAAA;AAE5B,+EAA+E;AAC/E,kFAA+E;AAAtE,oIAAA,uBAAuB,OAAA;AAEhC,4EAAmH;AAA1G,8HAAA,oBAAoB,OAAA;AAAE,iIAAA,uBAAuB,OAAA;AAAE,yHAAA,eAAe,OAAA;AACvE,8FAA0F;AAAjF,+IAAA,4BAA4B,OAAA;AACrC,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAC9B,kEAA+D;AAAtD,oHAAA,eAAe,OAAA;AAIxB,mEAAmE;AACnE,gDAAgD;AAChD,6BAA4D;AAAnD,2FAAA,IAAI,OAAA;AAAE,iGAAA,UAAU,OAAA;AAAE,wGAAA,iBAAiB,OAAA;AAC5C,6BAAqG;AAA5F,qGAAA,cAAc,OAAA;AAAE,qGAAA,cAAc,OAAA;AAAE,2GAAA,oBAAoB,OAAA;AAAE,6GAAA,sBAAsB,OAAA;AACrF,6BAAqC;AAA5B,mGAAA,YAAY,OAAA;AAGrB,uEAAuE;AACvE,yEAAyE;AACzE,yDAAyD;AACzD,+BAAwC;AAA/B,sGAAA,cAAc,OAAA;AAEvB,iFAAiF;AACjF,8EAA8E;AAC9E,qEAAqE;AACrE,oEAAoE"}
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
* configuration and no controllers — `Neo4jService` is available through the
|
|
9
9
|
* global core module, mirroring how `GraphModule` provides
|
|
10
10
|
* `UserModulesRepository` without importing `Neo4JModule`.
|
|
11
|
+
*
|
|
12
|
+
* Global so the session guards, which are instantiated in every controller's
|
|
13
|
+
* module, can inject `ModulePermissionGate`. The generated app module imports
|
|
14
|
+
* it; every service in it is inert while `permissions.enforce` is off.
|
|
11
15
|
*/
|
|
12
16
|
export declare class RbacPermissionModule {
|
|
13
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac-permission.module.d.ts","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac-permission.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rbac-permission.module.d.ts","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac-permission.module.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;GAcG;AACH,qBAYa,oBAAoB;CAAG"}
|
|
@@ -8,7 +8,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.RbacPermissionModule = void 0;
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
|
+
const core_1 = require("@nestjs/core");
|
|
11
12
|
const rbac_permission_repository_1 = require("./repositories/rbac-permission.repository");
|
|
13
|
+
const module_permission_audit_service_1 = require("./services/module-permission-audit.service");
|
|
14
|
+
const module_permission_gate_1 = require("./services/module-permission.gate");
|
|
15
|
+
const module_permission_service_1 = require("./services/module-permission.service");
|
|
12
16
|
const rbac_permission_service_1 = require("./services/rbac-permission.service");
|
|
13
17
|
/**
|
|
14
18
|
* Standalone provider module for RBAC permission checks.
|
|
@@ -20,14 +24,26 @@ const rbac_permission_service_1 = require("./services/rbac-permission.service");
|
|
|
20
24
|
* configuration and no controllers — `Neo4jService` is available through the
|
|
21
25
|
* global core module, mirroring how `GraphModule` provides
|
|
22
26
|
* `UserModulesRepository` without importing `Neo4JModule`.
|
|
27
|
+
*
|
|
28
|
+
* Global so the session guards, which are instantiated in every controller's
|
|
29
|
+
* module, can inject `ModulePermissionGate`. The generated app module imports
|
|
30
|
+
* it; every service in it is inert while `permissions.enforce` is off.
|
|
23
31
|
*/
|
|
24
32
|
let RbacPermissionModule = class RbacPermissionModule {
|
|
25
33
|
};
|
|
26
34
|
exports.RbacPermissionModule = RbacPermissionModule;
|
|
27
35
|
exports.RbacPermissionModule = RbacPermissionModule = __decorate([
|
|
36
|
+
(0, common_1.Global)(),
|
|
28
37
|
(0, common_1.Module)({
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
imports: [core_1.DiscoveryModule],
|
|
39
|
+
providers: [
|
|
40
|
+
rbac_permission_repository_1.RbacPermissionRepository,
|
|
41
|
+
rbac_permission_service_1.RbacPermissionService,
|
|
42
|
+
module_permission_service_1.ModulePermissionService,
|
|
43
|
+
module_permission_gate_1.ModulePermissionGate,
|
|
44
|
+
module_permission_audit_service_1.ModulePermissionAuditService,
|
|
45
|
+
],
|
|
46
|
+
exports: [rbac_permission_repository_1.RbacPermissionRepository, rbac_permission_service_1.RbacPermissionService, module_permission_service_1.ModulePermissionService, module_permission_gate_1.ModulePermissionGate],
|
|
31
47
|
})
|
|
32
48
|
], RbacPermissionModule);
|
|
33
49
|
//# sourceMappingURL=rbac-permission.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac-permission.module.js","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac-permission.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"rbac-permission.module.js","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac-permission.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,uCAA+C;AAC/C,0FAAqF;AACrF,gGAA0F;AAC1F,8EAAyE;AACzE,oFAA+E;AAC/E,gFAA2E;AAE3E;;;;;;;;;;;;;;GAcG;AAaI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oDAAoB;+BAApB,oBAAoB;IAZhC,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,sBAAe,CAAC;QAC1B,SAAS,EAAE;YACT,qDAAwB;YACxB,+CAAqB;YACrB,mDAAuB;YACvB,6CAAoB;YACpB,8DAA4B;SAC7B;QACD,OAAO,EAAE,CAAC,qDAAwB,EAAE,+CAAqB,EAAE,mDAAuB,EAAE,6CAAoB,CAAC;KAC1G,CAAC;GACW,oBAAoB,CAAG"}
|
|
@@ -8,4 +8,12 @@
|
|
|
8
8
|
* it from there rather than duplicating it here.
|
|
9
9
|
*/
|
|
10
10
|
export declare const RBAC_MATRIX_TOKEN: unique symbol;
|
|
11
|
+
/**
|
|
12
|
+
* DI token carrying the bootstrap option `permissions.enforce` (boolean).
|
|
13
|
+
*
|
|
14
|
+
* Provided globally by the generated app module. Every consumer injects it
|
|
15
|
+
* `@Optional()` and treats a missing value as `false`, so an app that never
|
|
16
|
+
* sets the option behaves exactly as before.
|
|
17
|
+
*/
|
|
18
|
+
export declare const PERMISSIONS_ENFORCE: unique symbol;
|
|
11
19
|
//# sourceMappingURL=rbac.tokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac.tokens.d.ts","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac.tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,eAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"rbac.tokens.d.ts","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac.tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,eAAgC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RBAC_MATRIX_TOKEN = void 0;
|
|
3
|
+
exports.PERMISSIONS_ENFORCE = exports.RBAC_MATRIX_TOKEN = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* DI token for the declarative RBAC matrix.
|
|
6
6
|
*
|
|
@@ -11,4 +11,12 @@ exports.RBAC_MATRIX_TOKEN = void 0;
|
|
|
11
11
|
* it from there rather than duplicating it here.
|
|
12
12
|
*/
|
|
13
13
|
exports.RBAC_MATRIX_TOKEN = Symbol("RBAC_MATRIX_TOKEN");
|
|
14
|
+
/**
|
|
15
|
+
* DI token carrying the bootstrap option `permissions.enforce` (boolean).
|
|
16
|
+
*
|
|
17
|
+
* Provided globally by the generated app module. Every consumer injects it
|
|
18
|
+
* `@Optional()` and treats a missing value as `false`, so an app that never
|
|
19
|
+
* sets the option behaves exactly as before.
|
|
20
|
+
*/
|
|
21
|
+
exports.PERMISSIONS_ENFORCE = Symbol("PERMISSIONS_ENFORCE");
|
|
14
22
|
//# sourceMappingURL=rbac.tokens.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac.tokens.js","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac.tokens.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"rbac.tokens.js","sourceRoot":"","sources":["../../../src/foundations/rbac/rbac.tokens.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE7D;;;;;;GAMG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
|
|
2
2
|
import type { RbacAction } from "../services/rbac-permission.service";
|
|
3
|
+
/**
|
|
4
|
+
* Effective permission values per module id. A value is `true`, `false` or a
|
|
5
|
+
* record path (a non-empty string such as `"id"`), exactly as resolved by
|
|
6
|
+
* `modulePermissionResolutionQuery`.
|
|
7
|
+
*/
|
|
8
|
+
export type EffectivePermissions = Map<string, Record<RbacAction, boolean | string>>;
|
|
3
9
|
/**
|
|
4
10
|
* Resolves the effective per-module permission flags for a user. Mirrors the
|
|
5
11
|
* permission model used by the rest of the app (see AuthRepository and
|
|
@@ -9,7 +15,7 @@ import type { RbacAction } from "../services/rbac-permission.service";
|
|
|
9
15
|
* `permissions` JSON with any role-level `HAS_PERMISSIONS` overrides.
|
|
10
16
|
*
|
|
11
17
|
* Used by RbacPermissionService to answer `can(userId, moduleId, action)`
|
|
12
|
-
* for the MCP layer.
|
|
18
|
+
* for the MCP layer, and by ModulePermissionService for the request gate.
|
|
13
19
|
*/
|
|
14
20
|
export declare class RbacPermissionRepository {
|
|
15
21
|
private readonly neo4j;
|
|
@@ -27,5 +33,27 @@ export declare class RbacPermissionRepository {
|
|
|
27
33
|
* types (`read`, `create`, `update`, `delete`).
|
|
28
34
|
*/
|
|
29
35
|
findEffectivePermissionsForUser(userId: string): Promise<Map<string, Record<RbacAction, boolean>>>;
|
|
36
|
+
/**
|
|
37
|
+
* Effective permissions of a user in ONE company: the module defaults plus
|
|
38
|
+
* the grants of the roles on the user's membership in that company and on
|
|
39
|
+
* the user's platform memberships (no `IN_COMPANY`). Never follows the
|
|
40
|
+
* legacy `(User)-[:BELONGS_TO]->(Company)` edge.
|
|
41
|
+
*
|
|
42
|
+
* With no `companyId` (a platform session) it resolves through the
|
|
43
|
+
* platform membership only (`adminModuleQuery`).
|
|
44
|
+
*
|
|
45
|
+
* Record-path values are kept as strings: the request gate allows them at
|
|
46
|
+
* the section level and leaves the record decision to the app.
|
|
47
|
+
*
|
|
48
|
+
* Intentional exception to "use buildDefaultMatch": this is the library's
|
|
49
|
+
* own permission resolution (the same `company` binding UserModulesRepository
|
|
50
|
+
* uses), not an entity read.
|
|
51
|
+
*/
|
|
52
|
+
findEffectivePermissions(params: {
|
|
53
|
+
userId: string;
|
|
54
|
+
companyId: string | undefined;
|
|
55
|
+
}): Promise<EffectivePermissions>;
|
|
56
|
+
/** The subset of `ids` that exist as `(:Module)` nodes. */
|
|
57
|
+
findExistingModuleIds(ids: string[]): Promise<Set<string>>;
|
|
30
58
|
}
|
|
31
59
|
//# sourceMappingURL=rbac-permission.repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac-permission.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/rbac/repositories/rbac-permission.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"rbac-permission.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/rbac/repositories/rbac-permission.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAI1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAOtE;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;AAErF;;;;;;;;;;GAUG;AACH,qBACa,wBAAwB;IAGvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6C;gBAEvC,KAAK,EAAE,YAAY;IAEhD;;;;;;;;;;OAUG;IACG,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAgCxG;;;;;;;;;;;;;;;OAeG;IACG,wBAAwB,CAAC,MAAM,EAAE;QACrC,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;KAC/B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyCjC,2DAA2D;IACrD,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;CAcjE"}
|
|
@@ -13,6 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.RbacPermissionRepository = void 0;
|
|
14
14
|
const common_1 = require("@nestjs/common");
|
|
15
15
|
const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
|
|
16
|
+
const module_model_1 = require("../../module/entities/module.model");
|
|
16
17
|
const feature_module_query_1 = require("../../module/queries/feature.module.query");
|
|
17
18
|
/**
|
|
18
19
|
* Resolves the effective per-module permission flags for a user. Mirrors the
|
|
@@ -23,7 +24,7 @@ const feature_module_query_1 = require("../../module/queries/feature.module.quer
|
|
|
23
24
|
* `permissions` JSON with any role-level `HAS_PERMISSIONS` overrides.
|
|
24
25
|
*
|
|
25
26
|
* Used by RbacPermissionService to answer `can(userId, moduleId, action)`
|
|
26
|
-
* for the MCP layer.
|
|
27
|
+
* for the MCP layer, and by ModulePermissionService for the request gate.
|
|
27
28
|
*/
|
|
28
29
|
let RbacPermissionRepository = RbacPermissionRepository_1 = class RbacPermissionRepository {
|
|
29
30
|
constructor(neo4j) {
|
|
@@ -71,6 +72,77 @@ let RbacPermissionRepository = RbacPermissionRepository_1 = class RbacPermission
|
|
|
71
72
|
}
|
|
72
73
|
return map;
|
|
73
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Effective permissions of a user in ONE company: the module defaults plus
|
|
77
|
+
* the grants of the roles on the user's membership in that company and on
|
|
78
|
+
* the user's platform memberships (no `IN_COMPANY`). Never follows the
|
|
79
|
+
* legacy `(User)-[:BELONGS_TO]->(Company)` edge.
|
|
80
|
+
*
|
|
81
|
+
* With no `companyId` (a platform session) it resolves through the
|
|
82
|
+
* platform membership only (`adminModuleQuery`).
|
|
83
|
+
*
|
|
84
|
+
* Record-path values are kept as strings: the request gate allows them at
|
|
85
|
+
* the section level and leaves the record decision to the app.
|
|
86
|
+
*
|
|
87
|
+
* Intentional exception to "use buildDefaultMatch": this is the library's
|
|
88
|
+
* own permission resolution (the same `company` binding UserModulesRepository
|
|
89
|
+
* uses), not an entity read.
|
|
90
|
+
*/
|
|
91
|
+
async findEffectivePermissions(params) {
|
|
92
|
+
const result = params.companyId
|
|
93
|
+
? await this.neo4j.read(`
|
|
94
|
+
MATCH (user:User {id: $userId})
|
|
95
|
+
MATCH (company:Company {id: $companyId})
|
|
96
|
+
${feature_module_query_1.featureModuleQuery}
|
|
97
|
+
`, { userId: params.userId, companyId: params.companyId })
|
|
98
|
+
: await this.neo4j.read(feature_module_query_1.adminModuleQuery, { searchValue: params.userId });
|
|
99
|
+
const map = new Map();
|
|
100
|
+
for (const record of result.records) {
|
|
101
|
+
const moduleNode = record.get("module");
|
|
102
|
+
const props = moduleNode?.properties;
|
|
103
|
+
if (!props)
|
|
104
|
+
continue;
|
|
105
|
+
const id = props.id;
|
|
106
|
+
const permsJson = props.permissions;
|
|
107
|
+
if (typeof id !== "string" || !id.length || typeof permsJson !== "string")
|
|
108
|
+
continue;
|
|
109
|
+
try {
|
|
110
|
+
const perms = JSON.parse(permsJson);
|
|
111
|
+
const value = (type) => {
|
|
112
|
+
const raw = perms.find((p) => p.type === type)?.value;
|
|
113
|
+
if (raw === true)
|
|
114
|
+
return true;
|
|
115
|
+
if (typeof raw === "string" && raw.length > 0)
|
|
116
|
+
return raw;
|
|
117
|
+
return false;
|
|
118
|
+
};
|
|
119
|
+
map.set(id, {
|
|
120
|
+
read: value("read"),
|
|
121
|
+
create: value("create"),
|
|
122
|
+
update: value("update"),
|
|
123
|
+
delete: value("delete"),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
this.logger.warn(`findEffectivePermissions: malformed permissions JSON on module ${id}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return map;
|
|
131
|
+
}
|
|
132
|
+
/** The subset of `ids` that exist as `(:Module)` nodes. */
|
|
133
|
+
async findExistingModuleIds(ids) {
|
|
134
|
+
if (ids.length === 0)
|
|
135
|
+
return new Set();
|
|
136
|
+
const query = this.neo4j.initQuery({ serialiser: module_model_1.ModuleModel });
|
|
137
|
+
query.queryParams = { ...query.queryParams, ids };
|
|
138
|
+
query.query += `
|
|
139
|
+
MATCH (module:Module)
|
|
140
|
+
WHERE module.id IN $ids
|
|
141
|
+
RETURN module
|
|
142
|
+
`;
|
|
143
|
+
const modules = await this.neo4j.readMany(query);
|
|
144
|
+
return new Set(modules.map((module) => module.id));
|
|
145
|
+
}
|
|
74
146
|
};
|
|
75
147
|
exports.RbacPermissionRepository = RbacPermissionRepository;
|
|
76
148
|
exports.RbacPermissionRepository = RbacPermissionRepository = RbacPermissionRepository_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac-permission.repository.js","sourceRoot":"","sources":["../../../../src/foundations/rbac/repositories/rbac-permission.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8EAA0E;
|
|
1
|
+
{"version":3,"file":"rbac-permission.repository.js","sourceRoot":"","sources":["../../../../src/foundations/rbac/repositories/rbac-permission.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { OnApplicationBootstrap } from "@nestjs/common";
|
|
2
|
+
import { DiscoveryService, MetadataScanner, Reflector } from "@nestjs/core";
|
|
3
|
+
import { RbacPermissionRepository } from "../repositories/rbac-permission.repository";
|
|
4
|
+
interface AuditedRoute {
|
|
5
|
+
label: string;
|
|
6
|
+
module: string | undefined;
|
|
7
|
+
isWrite: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Boot audit for the permission gate. Runs only when the app bootstraps with
|
|
11
|
+
* `permissions: { enforce: true }` (API and worker).
|
|
12
|
+
*
|
|
13
|
+
* Refuses to start when:
|
|
14
|
+
* - a route guarded by a session guard is a write (POST/PUT/PATCH/DELETE, or a
|
|
15
|
+
* `@ModuleACL` action that is a write) and has no section;
|
|
16
|
+
* - a section id referenced by any session-guarded route has no `(:Module)` node.
|
|
17
|
+
*
|
|
18
|
+
* This is what makes the gate fail closed for writes at startup instead of at
|
|
19
|
+
* request time.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ModulePermissionAuditService implements OnApplicationBootstrap {
|
|
22
|
+
private readonly discovery;
|
|
23
|
+
private readonly metadataScanner;
|
|
24
|
+
private readonly reflector;
|
|
25
|
+
private readonly repository;
|
|
26
|
+
private readonly enforce?;
|
|
27
|
+
constructor(discovery: DiscoveryService, metadataScanner: MetadataScanner, reflector: Reflector, repository: RbacPermissionRepository, enforce?: boolean);
|
|
28
|
+
onApplicationBootstrap(): Promise<void>;
|
|
29
|
+
/** Every session-guarded route with its resolved section. Exposed for tests. */
|
|
30
|
+
collectRoutes(): AuditedRoute[];
|
|
31
|
+
audit(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=module-permission-audit.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-permission-audit.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/rbac/services/module-permission-audit.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,sBAAsB,EAA2B,MAAM,gBAAgB,CAAC;AAErG,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAatF,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAcD;;;;;;;;;;;GAWG;AACH,qBACa,4BAA6B,YAAW,sBAAsB;IAEvE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAG3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBANR,SAAS,EAAE,gBAAgB,EAC3B,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,wBAAwB,EAGpC,OAAO,CAAC,EAAE,OAAO;IAG9B,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7C,gFAAgF;IAChF,aAAa,IAAI,YAAY,EAAE;IAyCzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B7B"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ModulePermissionAuditService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const constants_1 = require("@nestjs/common/constants");
|
|
18
|
+
const core_1 = require("@nestjs/core");
|
|
19
|
+
const module_decorator_1 = require("../../../common/decorators/module.decorator");
|
|
20
|
+
const jwt_auth_admin_guard_1 = require("../../../common/guards/jwt.auth.admin.guard");
|
|
21
|
+
const jwt_auth_guard_1 = require("../../../common/guards/jwt.auth.guard");
|
|
22
|
+
const jwt_auth_optional_guard_1 = require("../../../common/guards/jwt.auth.optional.guard");
|
|
23
|
+
const rbac_permission_repository_1 = require("../repositories/rbac-permission.repository");
|
|
24
|
+
const rbac_tokens_1 = require("../rbac.tokens");
|
|
25
|
+
const module_permission_gate_1 = require("./module-permission.gate");
|
|
26
|
+
/** The guards that run `ModulePermissionGate`. Subclasses count too. */
|
|
27
|
+
const SESSION_GUARDS = [
|
|
28
|
+
jwt_auth_guard_1.JwtAuthGuard,
|
|
29
|
+
jwt_auth_admin_guard_1.AdminJwtAuthGuard,
|
|
30
|
+
jwt_auth_optional_guard_1.OptionalJwtAuthGuard,
|
|
31
|
+
];
|
|
32
|
+
const WRITE_ACTIONS = new Set(["create", "update", "delete"]);
|
|
33
|
+
function isSessionGuard(guard) {
|
|
34
|
+
const type = typeof guard === "function" ? guard : guard?.constructor;
|
|
35
|
+
if (typeof type !== "function")
|
|
36
|
+
return false;
|
|
37
|
+
return SESSION_GUARDS.some((g) => type === g || type.prototype instanceof g);
|
|
38
|
+
}
|
|
39
|
+
function joinPaths(prefix, path) {
|
|
40
|
+
const first = (value) => (Array.isArray(value) ? String(value[0] ?? "") : String(value ?? ""));
|
|
41
|
+
const parts = [first(prefix), first(path)].map((p) => p.replace(/^\/+|\/+$/g, "")).filter((p) => p.length);
|
|
42
|
+
return `/${parts.join("/")}`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Boot audit for the permission gate. Runs only when the app bootstraps with
|
|
46
|
+
* `permissions: { enforce: true }` (API and worker).
|
|
47
|
+
*
|
|
48
|
+
* Refuses to start when:
|
|
49
|
+
* - a route guarded by a session guard is a write (POST/PUT/PATCH/DELETE, or a
|
|
50
|
+
* `@ModuleACL` action that is a write) and has no section;
|
|
51
|
+
* - a section id referenced by any session-guarded route has no `(:Module)` node.
|
|
52
|
+
*
|
|
53
|
+
* This is what makes the gate fail closed for writes at startup instead of at
|
|
54
|
+
* request time.
|
|
55
|
+
*/
|
|
56
|
+
let ModulePermissionAuditService = class ModulePermissionAuditService {
|
|
57
|
+
constructor(discovery, metadataScanner, reflector, repository, enforce) {
|
|
58
|
+
this.discovery = discovery;
|
|
59
|
+
this.metadataScanner = metadataScanner;
|
|
60
|
+
this.reflector = reflector;
|
|
61
|
+
this.repository = repository;
|
|
62
|
+
this.enforce = enforce;
|
|
63
|
+
}
|
|
64
|
+
async onApplicationBootstrap() {
|
|
65
|
+
if (this.enforce !== true)
|
|
66
|
+
return;
|
|
67
|
+
await this.audit();
|
|
68
|
+
}
|
|
69
|
+
/** Every session-guarded route with its resolved section. Exposed for tests. */
|
|
70
|
+
collectRoutes() {
|
|
71
|
+
const routes = [];
|
|
72
|
+
for (const wrapper of this.discovery.getControllers()) {
|
|
73
|
+
const controller = wrapper.metatype;
|
|
74
|
+
if (typeof controller !== "function" || !controller.prototype)
|
|
75
|
+
continue;
|
|
76
|
+
const prototype = controller.prototype;
|
|
77
|
+
const classGuards = this.reflector.get(constants_1.GUARDS_METADATA, controller) ?? [];
|
|
78
|
+
const classDefinition = this.reflector.get(module_decorator_1.MODULE_ACL_METADATA, controller);
|
|
79
|
+
const controllerPath = this.reflector.get(constants_1.PATH_METADATA, controller);
|
|
80
|
+
for (const methodName of this.metadataScanner.getAllMethodNames(prototype)) {
|
|
81
|
+
const handler = prototype[methodName];
|
|
82
|
+
if (typeof handler !== "function")
|
|
83
|
+
continue;
|
|
84
|
+
const requestMethod = this.reflector.get(constants_1.METHOD_METADATA, handler);
|
|
85
|
+
const routePath = this.reflector.get(constants_1.PATH_METADATA, handler);
|
|
86
|
+
if (requestMethod === undefined || routePath === undefined)
|
|
87
|
+
continue;
|
|
88
|
+
const handlerGuards = this.reflector.get(constants_1.GUARDS_METADATA, handler) ?? [];
|
|
89
|
+
if (![...classGuards, ...handlerGuards].some(isSessionGuard))
|
|
90
|
+
continue;
|
|
91
|
+
const method = common_1.RequestMethod[requestMethod] ?? String(requestMethod);
|
|
92
|
+
const { module, action } = (0, module_permission_gate_1.resolveRouteAcl)({
|
|
93
|
+
classDefinition,
|
|
94
|
+
handlerDefinition: this.reflector.get(module_decorator_1.MODULE_ACL_METADATA, handler),
|
|
95
|
+
method,
|
|
96
|
+
});
|
|
97
|
+
routes.push({
|
|
98
|
+
label: `${method} ${joinPaths(controllerPath, routePath)} (${controller.name}.${methodName})`,
|
|
99
|
+
module,
|
|
100
|
+
isWrite: WRITE_ACTIONS.has(action),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return routes;
|
|
105
|
+
}
|
|
106
|
+
async audit() {
|
|
107
|
+
const routes = this.collectRoutes();
|
|
108
|
+
const unsectioned = routes.filter((r) => r.isWrite && !r.module).map((r) => r.label);
|
|
109
|
+
if (unsectioned.length > 0) {
|
|
110
|
+
throw new Error(`Permission audit failed: ${unsectioned.length} session-guarded write route(s) have no @ModuleACL section:\n` +
|
|
111
|
+
unsectioned.map((label) => ` - ${label}`).join("\n"));
|
|
112
|
+
}
|
|
113
|
+
const referenced = Array.from(new Set(routes.map((r) => r.module).filter((m) => !!m))).sort();
|
|
114
|
+
const existing = await this.repository.findExistingModuleIds(referenced);
|
|
115
|
+
const missing = referenced.filter((id) => !existing.has(id));
|
|
116
|
+
if (missing.length > 0) {
|
|
117
|
+
const byModule = missing.map((id) => {
|
|
118
|
+
const example = routes.find((r) => r.module === id)?.label ?? "";
|
|
119
|
+
return ` - ${id} (e.g. ${example})`;
|
|
120
|
+
});
|
|
121
|
+
throw new Error(`Permission audit failed: ${missing.length} section id(s) referenced by @ModuleACL have no (:Module) node. ` +
|
|
122
|
+
`Seed them in a migration before switching permissions.enforce on:\n` +
|
|
123
|
+
byModule.join("\n"));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
exports.ModulePermissionAuditService = ModulePermissionAuditService;
|
|
128
|
+
exports.ModulePermissionAuditService = ModulePermissionAuditService = __decorate([
|
|
129
|
+
(0, common_1.Injectable)(),
|
|
130
|
+
__param(4, (0, common_1.Optional)()),
|
|
131
|
+
__param(4, (0, common_1.Inject)(rbac_tokens_1.PERMISSIONS_ENFORCE)),
|
|
132
|
+
__metadata("design:paramtypes", [core_1.DiscoveryService,
|
|
133
|
+
core_1.MetadataScanner,
|
|
134
|
+
core_1.Reflector,
|
|
135
|
+
rbac_permission_repository_1.RbacPermissionRepository, Boolean])
|
|
136
|
+
], ModulePermissionAuditService);
|
|
137
|
+
//# sourceMappingURL=module-permission-audit.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-permission-audit.service.js","sourceRoot":"","sources":["../../../../src/foundations/rbac/services/module-permission-audit.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ExecutionContext } from "@nestjs/common";
|
|
2
|
+
import { Reflector } from "@nestjs/core";
|
|
3
|
+
import { ClsService } from "nestjs-cls";
|
|
4
|
+
import type { ModuleDefinition } from "../../../common/decorators/module.decorator";
|
|
5
|
+
import { ModulePermissionService } from "./module-permission.service";
|
|
6
|
+
import type { RbacAction } from "./rbac-permission.service";
|
|
7
|
+
/**
|
|
8
|
+
* HTTP method → permission action. GET/HEAD/OPTIONS read, POST create, PUT/PATCH
|
|
9
|
+
* update, DELETE delete. Anything else is treated as a write (update), so an
|
|
10
|
+
* unexpected verb never slips through as a read.
|
|
11
|
+
*/
|
|
12
|
+
export declare function rbacActionForHttpMethod(method: string | undefined): RbacAction;
|
|
13
|
+
/**
|
|
14
|
+
* Section and action of a route: the handler `@ModuleACL` wins over the class
|
|
15
|
+
* one, field by field; the action falls back to the HTTP-method mapping.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveRouteAcl(params: {
|
|
18
|
+
classDefinition: ModuleDefinition | undefined;
|
|
19
|
+
handlerDefinition: ModuleDefinition | undefined;
|
|
20
|
+
method: string | undefined;
|
|
21
|
+
}): {
|
|
22
|
+
module: string | undefined;
|
|
23
|
+
action: RbacAction;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Request-level permission check, run by the session guards (`JwtAuthGuard`,
|
|
27
|
+
* `AdminJwtAuthGuard`, `OptionalJwtAuthGuard`) right after authentication.
|
|
28
|
+
*
|
|
29
|
+
* Off unless the app bootstraps with `permissions: { enforce: true }`: with it
|
|
30
|
+
* off, `assert` returns before reading metadata or touching the database.
|
|
31
|
+
*
|
|
32
|
+
* Rules:
|
|
33
|
+
* - A read with no section is allowed (company scoping still applies).
|
|
34
|
+
* - A write with no section is refused (the boot audit makes this unreachable).
|
|
35
|
+
* - Otherwise the caller's effective permission in the token's company decides:
|
|
36
|
+
* `true` or a record path allows, `false` or absent refuses with 403.
|
|
37
|
+
* - No administrator bypass.
|
|
38
|
+
*/
|
|
39
|
+
export declare class ModulePermissionGate {
|
|
40
|
+
private readonly reflector;
|
|
41
|
+
private readonly cls;
|
|
42
|
+
private readonly permissions;
|
|
43
|
+
private readonly enforce?;
|
|
44
|
+
constructor(reflector: Reflector, cls: ClsService, permissions: ModulePermissionService, enforce?: boolean);
|
|
45
|
+
get enabled(): boolean;
|
|
46
|
+
assert(params: {
|
|
47
|
+
request: any;
|
|
48
|
+
context: ExecutionContext;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=module-permission.gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-permission.gate.d.ts","sourceRoot":"","sources":["../../../../src/foundations/rbac/services/module-permission.gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAoD,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAEpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAa9E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,eAAe,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC9C,iBAAiB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAKrD;AAED;;;;;;;;;;;;;GAaG;AACH,qBACa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAG5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBALR,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,UAAU,EACf,WAAW,EAAE,uBAAuB,EAGpC,OAAO,CAAC,EAAE,OAAO;IAGpC,IAAI,OAAO,IAAI,OAAO,CAErB;IAEK,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBjF"}
|