@acmekit/rbac 2.13.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.
Files changed (58) hide show
  1. package/dist/index.d.ts +63 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +13 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/loaders/initial-data.d.ts +4 -0
  6. package/dist/loaders/initial-data.d.ts.map +1 -0
  7. package/dist/loaders/initial-data.js +27 -0
  8. package/dist/loaders/initial-data.js.map +1 -0
  9. package/dist/migrations/Migration20251219163509.d.ts +5 -0
  10. package/dist/migrations/Migration20251219163509.d.ts.map +1 -0
  11. package/dist/migrations/Migration20251219163509.js +36 -0
  12. package/dist/migrations/Migration20251219163509.js.map +1 -0
  13. package/dist/models/index.d.ts +5 -0
  14. package/dist/models/index.d.ts.map +1 -0
  15. package/dist/models/index.js +15 -0
  16. package/dist/models/index.js.map +1 -0
  17. package/dist/models/rbac-policy.d.ts +11 -0
  18. package/dist/models/rbac-policy.d.ts.map +1 -0
  19. package/dist/models/rbac-policy.js +30 -0
  20. package/dist/models/rbac-policy.js.map +1 -0
  21. package/dist/models/rbac-role-inheritance.d.ts +58 -0
  22. package/dist/models/rbac-role-inheritance.d.ts.map +1 -0
  23. package/dist/models/rbac-role-inheritance.js +33 -0
  24. package/dist/models/rbac-role-inheritance.js.map +1 -0
  25. package/dist/models/rbac-role-parent.d.ts +48 -0
  26. package/dist/models/rbac-role-parent.d.ts.map +1 -0
  27. package/dist/models/rbac-role-parent.js +31 -0
  28. package/dist/models/rbac-role-parent.js.map +1 -0
  29. package/dist/models/rbac-role-policy.d.ts +28 -0
  30. package/dist/models/rbac-role-policy.d.ts.map +1 -0
  31. package/dist/models/rbac-role-policy.js +32 -0
  32. package/dist/models/rbac-role-policy.js.map +1 -0
  33. package/dist/models/rbac-role.d.ts +28 -0
  34. package/dist/models/rbac-role.d.ts.map +1 -0
  35. package/dist/models/rbac-role.js +30 -0
  36. package/dist/models/rbac-role.js.map +1 -0
  37. package/dist/repositories/index.d.ts +2 -0
  38. package/dist/repositories/index.d.ts.map +1 -0
  39. package/dist/repositories/index.js +18 -0
  40. package/dist/repositories/index.js.map +1 -0
  41. package/dist/repositories/rbac.d.ts +9 -0
  42. package/dist/repositories/rbac.d.ts.map +1 -0
  43. package/dist/repositories/rbac.js +101 -0
  44. package/dist/repositories/rbac.js.map +1 -0
  45. package/dist/services/index.d.ts +2 -0
  46. package/dist/services/index.d.ts.map +1 -0
  47. package/dist/services/index.js +9 -0
  48. package/dist/services/index.js.map +1 -0
  49. package/dist/services/rbac-module-service.d.ts +138 -0
  50. package/dist/services/rbac-module-service.d.ts.map +1 -0
  51. package/dist/services/rbac-module-service.js +216 -0
  52. package/dist/services/rbac-module-service.js.map +1 -0
  53. package/dist/tsconfig.tsbuildinfo +1 -0
  54. package/dist/types/index.d.ts +2 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +3 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/package.json +45 -0
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("@acmekit/framework/utils");
7
+ const rbac_role_parent_1 = __importDefault(require("./rbac-role-parent"));
8
+ const rbac_role_policy_1 = __importDefault(require("./rbac-role-policy"));
9
+ const RbacRole = utils_1.model
10
+ .define("rbac_role", {
11
+ id: utils_1.model.id({ prefix: "role" }).primaryKey(),
12
+ name: utils_1.model.text().searchable(),
13
+ description: utils_1.model.text().nullable(),
14
+ metadata: utils_1.model.json().nullable(),
15
+ policies: utils_1.model.hasMany(() => rbac_role_policy_1.default, {
16
+ mappedBy: "role",
17
+ }),
18
+ parents: utils_1.model.hasMany(() => rbac_role_parent_1.default, {
19
+ mappedBy: "role",
20
+ }),
21
+ })
22
+ .indexes([
23
+ {
24
+ on: ["name"],
25
+ unique: true,
26
+ where: "deleted_at IS NULL",
27
+ },
28
+ ]);
29
+ exports.default = RbacRole;
30
+ //# sourceMappingURL=rbac-role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-role.js","sourceRoot":"","sources":["../../src/models/rbac-role.ts"],"names":[],"mappings":";;;;;AAAA,oDAAgD;AAChD,0EAA+C;AAC/C,0EAA+C;AAE/C,MAAM,QAAQ,GAAG,aAAK;KACnB,MAAM,CAAC,WAAW,EAAE;IACnB,EAAE,EAAE,aAAK,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE;IAC7C,IAAI,EAAE,aAAK,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE;IAC/B,WAAW,EAAE,aAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACpC,QAAQ,EAAE,aAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,aAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,0BAAc,EAAE;QAC5C,QAAQ,EAAE,MAAM;KACjB,CAAC;IACF,OAAO,EAAE,aAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,0BAAc,EAAE;QAC3C,QAAQ,EAAE,MAAM;KACjB,CAAC;CACH,CAAC;KACD,OAAO,CAAC;IACP;QACE,EAAE,EAAE,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,oBAAoB;KAC5B;CACF,CAAC,CAAA;AAEJ,kBAAe,QAAQ,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from "./rbac";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./rbac"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAsB"}
@@ -0,0 +1,9 @@
1
+ import { Context } from "@acmekit/framework/types";
2
+ import { MikroOrmBase } from "@acmekit/framework/utils";
3
+ export declare class RbacRepository extends MikroOrmBase {
4
+ constructor();
5
+ listPoliciesForRole(roleId: string, sharedContext?: Context): Promise<any[]>;
6
+ listPoliciesForRoles(roleIds: string[], sharedContext?: Context): Promise<Map<string, any[]>>;
7
+ checkForCycle(roleId: string, parentId: string, sharedContext?: Context): Promise<boolean>;
8
+ }
9
+ //# sourceMappingURL=rbac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/repositories/rbac.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,qBAAa,cAAe,SAAQ,YAAY;;IAOxC,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,aAAa,GAAE,OAAY,GAC1B,OAAO,CAAC,GAAG,EAAE,CAAC;IAQX,oBAAoB,CACxB,OAAO,EAAE,MAAM,EAAE,EACjB,aAAa,GAAE,OAAY,GAC1B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAiExB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,OAAY,GAC1B,OAAO,CAAC,OAAO,CAAC;CA+BpB"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RbacRepository = void 0;
4
+ const utils_1 = require("@acmekit/framework/utils");
5
+ class RbacRepository extends utils_1.MikroOrmBase {
6
+ constructor() {
7
+ // @ts-ignore
8
+ // eslint-disable-next-line prefer-rest-params
9
+ super(...arguments);
10
+ }
11
+ async listPoliciesForRole(roleId, sharedContext = {}) {
12
+ const policiesByRole = await this.listPoliciesForRoles([roleId], sharedContext);
13
+ return policiesByRole.get(roleId) || [];
14
+ }
15
+ async listPoliciesForRoles(roleIds, sharedContext = {}) {
16
+ const manager = this.getActiveManager(sharedContext);
17
+ const knex = manager.getKnex();
18
+ if (!roleIds?.length) {
19
+ return new Map();
20
+ }
21
+ const placeholders = roleIds.map(() => "?").join(",");
22
+ const query = `
23
+ WITH RECURSIVE role_hierarchy AS (
24
+ SELECT id, name, id as original_role_id, ARRAY[id] as path
25
+ FROM rbac_role
26
+ WHERE id IN (${placeholders}) AND deleted_at IS NULL
27
+
28
+ UNION ALL
29
+
30
+ SELECT r.id, r.name, rh.original_role_id, rh.path || r.id
31
+ FROM rbac_role r
32
+ INNER JOIN rbac_role_parent ri ON ri.parent_id = r.id
33
+ INNER JOIN role_hierarchy rh ON rh.id = ri.role_id
34
+ WHERE r.deleted_at IS NULL
35
+ AND ri.deleted_at IS NULL
36
+ AND NOT (r.id = ANY(rh.path))
37
+ )
38
+ SELECT DISTINCT
39
+ rh.original_role_id,
40
+ p.id,
41
+ p.key,
42
+ p.resource,
43
+ p.operation,
44
+ p.name,
45
+ p.description,
46
+ p.metadata,
47
+ p.created_at,
48
+ p.updated_at,
49
+ CASE WHEN rp.role_id = rh.original_role_id THEN NULL ELSE rp.role_id END as inherited_from_role_id
50
+ FROM rbac_policy p
51
+ INNER JOIN rbac_role_policy rp ON rp.policy_id = p.id
52
+ INNER JOIN role_hierarchy rh ON rh.id = rp.role_id
53
+ WHERE p.deleted_at IS NULL AND rp.deleted_at IS NULL
54
+ ORDER BY rh.original_role_id, p.resource, p.operation, p.key
55
+ `;
56
+ const result = await knex.raw(query, roleIds);
57
+ const rows = result.rows || [];
58
+ // Group policies by role_id
59
+ const policiesByRole = new Map();
60
+ for (const row of rows) {
61
+ const roleId = row.original_role_id;
62
+ delete row.original_role_id;
63
+ if (!policiesByRole.has(roleId)) {
64
+ policiesByRole.set(roleId, []);
65
+ }
66
+ policiesByRole.get(roleId).push(row);
67
+ }
68
+ return policiesByRole;
69
+ }
70
+ async checkForCycle(roleId, parentId, sharedContext = {}) {
71
+ const manager = this.getActiveManager(sharedContext);
72
+ const knex = manager.getKnex();
73
+ // Check if adding this parent would create a circular dependency
74
+ // A cycle exists if role_id is already an ancestor of parent_id
75
+ // (i.e., if we traverse up from parent_id, we reach role_id)
76
+ const query = `
77
+ WITH RECURSIVE role_hierarchy AS (
78
+ SELECT id, ARRAY[id] as path
79
+ FROM rbac_role
80
+ WHERE id = ? AND deleted_at IS NULL
81
+
82
+ UNION ALL
83
+
84
+ SELECT r.id, rh.path || r.id
85
+ FROM role_hierarchy rh
86
+ INNER JOIN rbac_role_parent ri ON ri.role_id = rh.id
87
+ INNER JOIN rbac_role r ON r.id = ri.parent_id
88
+ WHERE r.deleted_at IS NULL
89
+ AND ri.deleted_at IS NULL
90
+ AND NOT (r.id = ANY(rh.path))
91
+ )
92
+ SELECT EXISTS(
93
+ SELECT 1 FROM role_hierarchy WHERE id = ?
94
+ ) as has_cycle
95
+ `;
96
+ const result = await knex.raw(query, [parentId, roleId]);
97
+ return result.rows[0]?.has_cycle || false;
98
+ }
99
+ }
100
+ exports.RbacRepository = RbacRepository;
101
+ //# sourceMappingURL=rbac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.js","sourceRoot":"","sources":["../../src/repositories/rbac.ts"],"names":[],"mappings":";;;AAEA,oDAAuD;AAEvD,MAAa,cAAe,SAAQ,oBAAY;IAC9C;QACE,aAAa;QACb,8CAA8C;QAC9C,KAAK,CAAC,GAAG,SAAS,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,MAAc,EACd,gBAAyB,EAAE;QAE3B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,oBAAoB,CACpD,CAAC,MAAM,CAAC,EACR,aAAa,CACd,CAAA;QACD,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,OAAiB,EACjB,gBAAyB,EAAE;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAmB,aAAa,CAAC,CAAA;QACtE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;QAE9B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,GAAG,EAAE,CAAA;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAErD,MAAM,KAAK,GAAG;;;;uBAIK,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6B9B,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;QAE9B,4BAA4B;QAC5B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAA;QAE/C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAA;YACnC,OAAO,GAAG,CAAC,gBAAgB,CAAA;YAE3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;YAChC,CAAC;YAED,cAAc,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACvC,CAAC;QAED,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,MAAc,EACd,QAAgB,EAChB,gBAAyB,EAAE;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAmB,aAAa,CAAC,CAAA;QACtE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;QAE9B,iEAAiE;QACjE,gEAAgE;QAChE,6DAA6D;QAC7D,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;KAmBb,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,KAAK,CAAA;IAC3C,CAAC;CACF;AAzHD,wCAyHC"}
@@ -0,0 +1,2 @@
1
+ export { default as RbacModuleService } from "./rbac-module-service";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RbacModuleService = void 0;
7
+ var rbac_module_service_1 = require("./rbac-module-service");
8
+ Object.defineProperty(exports, "RbacModuleService", { enumerable: true, get: function () { return __importDefault(rbac_module_service_1).default; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;AAAA,6DAAoE;AAA3D,yIAAA,OAAO,OAAqB"}
@@ -0,0 +1,138 @@
1
+ import { Context, FilterableRbacRoleProps, FindConfig, RbacRoleDTO } from "@acmekit/framework/types";
2
+ import { CreateRbacRoleParentDTO, InferEntityType, IRbacModuleService, ModulesSdkTypes, RbacRoleParentDTO, UpdateRbacRoleParentDTO } from "@acmekit/types";
3
+ import { RbacPolicy, RbacRole, RbacRolePolicy } from "../models";
4
+ import { RbacRepository } from "../repositories";
5
+ type InjectedDependencies = {
6
+ rbacRepository: RbacRepository;
7
+ rbacRolePolicyService: ModulesSdkTypes.IAcmeKitInternalService<InferEntityType<typeof RbacRolePolicy>>;
8
+ rbacRoleService: ModulesSdkTypes.IAcmeKitInternalService<InferEntityType<typeof RbacRole>>;
9
+ rbacPolicyService: ModulesSdkTypes.IAcmeKitInternalService<InferEntityType<typeof RbacPolicy>>;
10
+ };
11
+ declare const RbacModuleService_base: import("@acmekit/framework/utils").AcmeKitServiceReturnType<import("@acmekit/framework/utils").ModelConfigurationsToConfigTemplate<{
12
+ readonly RbacRole: import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
13
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
14
+ name: import("@acmekit/framework/utils").TextProperty;
15
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
16
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
17
+ policies: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
18
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
19
+ role: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role">, undefined>;
20
+ policy: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
21
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
22
+ key: import("@acmekit/framework/utils").TextProperty;
23
+ resource: import("@acmekit/framework/utils").TextProperty;
24
+ operation: import("@acmekit/framework/utils").TextProperty;
25
+ name: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
26
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
27
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
28
+ }>, "rbac_policy">, undefined>;
29
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
30
+ }>, "rbac_role_policy">>;
31
+ parents: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
32
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
33
+ role: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role">, undefined>;
34
+ parent: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role">, undefined>;
35
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
36
+ }>, "rbac_role_parent">>;
37
+ }>, "rbac_role">;
38
+ readonly RbacPolicy: import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
39
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
40
+ key: import("@acmekit/framework/utils").TextProperty;
41
+ resource: import("@acmekit/framework/utils").TextProperty;
42
+ operation: import("@acmekit/framework/utils").TextProperty;
43
+ name: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
44
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
45
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
46
+ }>, "rbac_policy">;
47
+ readonly RbacRoleParent: import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
48
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
49
+ role: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
50
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
51
+ name: import("@acmekit/framework/utils").TextProperty;
52
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
53
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
54
+ policies: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
55
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
56
+ role: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role">, undefined>;
57
+ policy: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
58
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
59
+ key: import("@acmekit/framework/utils").TextProperty;
60
+ resource: import("@acmekit/framework/utils").TextProperty;
61
+ operation: import("@acmekit/framework/utils").TextProperty;
62
+ name: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
63
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
64
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
65
+ }>, "rbac_policy">, undefined>;
66
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
67
+ }>, "rbac_role_policy">>;
68
+ parents: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role_parent">>;
69
+ }>, "rbac_role">, undefined>;
70
+ parent: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
71
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
72
+ name: import("@acmekit/framework/utils").TextProperty;
73
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
74
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
75
+ policies: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
76
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
77
+ role: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role">, undefined>;
78
+ policy: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
79
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
80
+ key: import("@acmekit/framework/utils").TextProperty;
81
+ resource: import("@acmekit/framework/utils").TextProperty;
82
+ operation: import("@acmekit/framework/utils").TextProperty;
83
+ name: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
84
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
85
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
86
+ }>, "rbac_policy">, undefined>;
87
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
88
+ }>, "rbac_role_policy">>;
89
+ parents: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role_parent">>;
90
+ }>, "rbac_role">, undefined>;
91
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
92
+ }>, "rbac_role_parent">;
93
+ readonly RbacRolePolicy: import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
94
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
95
+ role: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
96
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
97
+ name: import("@acmekit/framework/utils").TextProperty;
98
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
99
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
100
+ policies: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role_policy">>;
101
+ parents: import("@acmekit/framework/utils").HasMany<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
102
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
103
+ role: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role">, undefined>;
104
+ parent: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder</*elided*/ any>, "rbac_role">, undefined>;
105
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
106
+ }>, "rbac_role_parent">>;
107
+ }>, "rbac_role">, undefined>;
108
+ policy: import("@acmekit/framework/utils").BelongsTo<() => import("@acmekit/framework/utils").DmlEntity<import("@acmekit/framework/utils").DMLEntitySchemaBuilder<{
109
+ id: import("@acmekit/framework/utils").PrimaryKeyModifier<string, import("@acmekit/framework/utils").IdProperty>;
110
+ key: import("@acmekit/framework/utils").TextProperty;
111
+ resource: import("@acmekit/framework/utils").TextProperty;
112
+ operation: import("@acmekit/framework/utils").TextProperty;
113
+ name: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
114
+ description: import("@acmekit/framework/utils").NullableModifier<string, import("@acmekit/framework/utils").TextProperty>;
115
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
116
+ }>, "rbac_policy">, undefined>;
117
+ metadata: import("@acmekit/framework/utils").NullableModifier<Record<string, unknown>, import("@acmekit/framework/utils").JSONProperty>;
118
+ }>, "rbac_role_policy">;
119
+ }>>;
120
+ export default class RbacModuleService extends RbacModuleService_base implements IRbacModuleService {
121
+ protected readonly rbacRepository_: RbacRepository;
122
+ protected readonly rbacRolePolicyService: ModulesSdkTypes.IAcmeKitInternalService<InferEntityType<typeof RbacRolePolicy>>;
123
+ protected readonly rbacRoleService: ModulesSdkTypes.IAcmeKitInternalService<InferEntityType<typeof RbacRole>>;
124
+ protected readonly rbacPolicyService: ModulesSdkTypes.IAcmeKitInternalService<InferEntityType<typeof RbacPolicy>>;
125
+ constructor({ rbacRepository, rbacRoleService, rbacPolicyService, rbacRolePolicyService, }: InjectedDependencies);
126
+ __hooks: {
127
+ onApplicationStart: () => Promise<void>;
128
+ };
129
+ onApplicationStart(): Promise<void>;
130
+ private syncRegisteredPolicies;
131
+ listPoliciesForRole(roleId: string, sharedContext?: Context): Promise<any[]>;
132
+ listRbacRoles(filters?: FilterableRbacRoleProps, config?: FindConfig<RbacRoleDTO>, sharedContext?: Context): Promise<RbacRoleDTO[]>;
133
+ listAndCountRbacRoles(filters?: FilterableRbacRoleProps, config?: FindConfig<RbacRoleDTO>, sharedContext?: Context): Promise<[RbacRoleDTO[], number]>;
134
+ createRbacRoleParents(data: CreateRbacRoleParentDTO[], sharedContext?: Context): Promise<RbacRoleParentDTO[]>;
135
+ updateRbacRoleParents(data: UpdateRbacRoleParentDTO[], sharedContext?: Context): Promise<RbacRoleParentDTO[]>;
136
+ }
137
+ export {};
138
+ //# sourceMappingURL=rbac-module-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-module-service.d.ts","sourceRoot":"","sources":["../../src/services/rbac-module-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,uBAAuB,EACvB,UAAU,EACV,WAAW,EACZ,MAAM,0BAA0B,CAAA;AASjC,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAkB,cAAc,EAAE,MAAM,SAAS,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,KAAK,oBAAoB,GAAG;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,qBAAqB,EAAE,eAAe,CAAC,uBAAuB,CAC5D,eAAe,CAAC,OAAO,cAAc,CAAC,CACvC,CAAA;IACD,eAAe,EAAE,eAAe,CAAC,uBAAuB,CACtD,eAAe,CAAC,OAAO,QAAQ,CAAC,CACjC,CAAA;IACD,iBAAiB,EAAE,eAAe,CAAC,uBAAuB,CACxD,eAAe,CAAC,OAAO,UAAU,CAAC,CACnC,CAAA;CACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAID,MAAM,CAAC,OAAO,OAAO,iBACnB,SAAQ,sBAMR,YAAW,kBAAkB;IAE7B,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAA;IAClD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,eAAe,CAAC,uBAAuB,CAC/E,eAAe,CAAC,OAAO,cAAc,CAAC,CACvC,CAAA;IACD,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC,uBAAuB,CACzE,eAAe,CAAC,OAAO,QAAQ,CAAC,CACjC,CAAA;IACD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,eAAe,CAAC,uBAAuB,CAC3E,eAAe,CAAC,OAAO,UAAU,CAAC,CACnC,CAAA;gBAEW,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACtB,EAAE,oBAAoB;IASvB,OAAO;;MAIN;IAEK,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;YAK3B,sBAAsB;IAsF9B,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACI,aAAa,GAAE,OAAY,GAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;IAMX,aAAa,CACjB,OAAO,GAAE,uBAA4B,EACrC,MAAM,GAAE,UAAU,CAAC,WAAW,CAAM,EAClB,aAAa,GAAE,OAAY,GAC5C,OAAO,CAAC,WAAW,EAAE,CAAC;IA4BnB,qBAAqB,CACzB,OAAO,GAAE,uBAA4B,EACrC,MAAM,GAAE,UAAU,CAAC,WAAW,CAAM,EAClB,aAAa,GAAE,OAAY,GAC5C,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;IA4B7B,qBAAqB,CACzB,IAAI,EAAE,uBAAuB,EAAE,EACb,aAAa,GAAE,OAAY,GAC5C,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA4BzB,qBAAqB,CACzB,IAAI,EAAE,uBAAuB,EAAE,EACb,aAAa,GAAE,OAAY,GAC5C,OAAO,CAAC,iBAAiB,EAAE,CAAC;CA2BhC"}
@@ -0,0 +1,216 @@
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
+ const utils_1 = require("@acmekit/framework/utils");
16
+ const _models_1 = require("../models");
17
+ const SUPER_ADMIN_KEY = "*:*";
18
+ class RbacModuleService extends (0, utils_1.AcmeKitService)({
19
+ RbacRole: _models_1.RbacRole,
20
+ RbacPolicy: _models_1.RbacPolicy,
21
+ RbacRoleParent: _models_1.RbacRoleParent,
22
+ RbacRolePolicy: _models_1.RbacRolePolicy,
23
+ }) {
24
+ constructor({ rbacRepository, rbacRoleService, rbacPolicyService, rbacRolePolicyService, }) {
25
+ // @ts-ignore
26
+ super(...arguments);
27
+ this.__hooks = {
28
+ onApplicationStart: async () => {
29
+ this.onApplicationStart();
30
+ },
31
+ };
32
+ this.rbacRepository_ = rbacRepository;
33
+ this.rbacRolePolicyService = rbacRolePolicyService;
34
+ this.rbacRoleService = rbacRoleService;
35
+ this.rbacPolicyService = rbacPolicyService;
36
+ }
37
+ async onApplicationStart() {
38
+ await this.syncRegisteredPolicies();
39
+ }
40
+ async syncRegisteredPolicies(sharedContext = {}) {
41
+ const registeredPolicies = Object.entries(utils_1.Policy).map(([name, { resource, operation, description }]) => ({
42
+ key: `${resource}:${operation}`,
43
+ name,
44
+ resource,
45
+ operation,
46
+ description,
47
+ }));
48
+ const registeredKeys = registeredPolicies.map((p) => p.key);
49
+ // Fetch all existing policies (including soft-deleted ones)
50
+ const existingPolicies = await this.listRbacPolicies({}, { withDeleted: true }, sharedContext);
51
+ const existingPoliciesMap = new Map(existingPolicies.map((p) => [p.key, p]));
52
+ const policiesToCreate = [];
53
+ const policiesToUpdate = [];
54
+ const policiesToRestore = [];
55
+ // Process registered policies
56
+ for (const registeredPolicy of registeredPolicies) {
57
+ if (registeredPolicy.key === "*" && registeredPolicy.operation === "*") {
58
+ continue;
59
+ }
60
+ const existing = existingPoliciesMap.get(registeredPolicy.key);
61
+ const hasChanges = existing &&
62
+ (existing.name !== registeredPolicy.name ||
63
+ existing.description !== registeredPolicy.description);
64
+ if (!existing) {
65
+ policiesToCreate.push(registeredPolicy);
66
+ }
67
+ else if (existing.deleted_at) {
68
+ policiesToRestore.push(existing.id);
69
+ if (hasChanges) {
70
+ policiesToUpdate.push({
71
+ id: existing.id,
72
+ name: registeredPolicy.name,
73
+ description: registeredPolicy.description,
74
+ });
75
+ }
76
+ }
77
+ else if (hasChanges) {
78
+ policiesToUpdate.push({
79
+ id: existing.id,
80
+ name: registeredPolicy.name,
81
+ description: registeredPolicy.description,
82
+ });
83
+ }
84
+ }
85
+ const policiesToSoftDelete = existingPolicies
86
+ .filter((p) => !p.deleted_at &&
87
+ !registeredKeys.includes(p.key) &&
88
+ p.key !== SUPER_ADMIN_KEY)
89
+ .map((p) => p.id);
90
+ // First restore any soft-deleted policies
91
+ if (policiesToRestore.length > 0) {
92
+ await this.restoreRbacPolicies(policiesToRestore, {}, sharedContext);
93
+ }
94
+ await (0, utils_1.promiseAll)([
95
+ policiesToCreate.length > 0 &&
96
+ this.rbacPolicyService.create(policiesToCreate, sharedContext),
97
+ policiesToUpdate.length > 0 &&
98
+ this.rbacPolicyService.upsert(policiesToUpdate, sharedContext),
99
+ policiesToSoftDelete.length > 0 &&
100
+ this.rbacPolicyService.softDelete(policiesToSoftDelete, sharedContext),
101
+ ]);
102
+ }
103
+ async listPoliciesForRole(roleId, sharedContext = {}) {
104
+ return await this.rbacRepository_.listPoliciesForRole(roleId, sharedContext);
105
+ }
106
+ // @ts-expect-error
107
+ async listRbacRoles(filters = {}, config = {}, sharedContext = {}) {
108
+ const roles = await super.listRbacRoles(filters, config, sharedContext);
109
+ const shouldIncludePolicies = config.relations?.includes("policies") ||
110
+ config.select?.includes("policies");
111
+ if (shouldIncludePolicies && roles.length > 0) {
112
+ const roleIds = roles.map((role) => role.id);
113
+ const policiesByRole = await this.rbacRepository_.listPoliciesForRoles(roleIds, sharedContext);
114
+ for (const role of roles) {
115
+ role.policies = policiesByRole.get(role.id) || [];
116
+ }
117
+ }
118
+ return roles;
119
+ }
120
+ // @ts-expect-error
121
+ async listAndCountRbacRoles(filters = {}, config = {}, sharedContext = {}) {
122
+ const [roles, count] = await super.listAndCountRbacRoles(filters, config, sharedContext);
123
+ const shouldIncludePolicies = config.relations?.includes("policies") ||
124
+ config.select?.includes("policies");
125
+ if (shouldIncludePolicies && roles.length > 0) {
126
+ const roleIds = roles.map((role) => role.id);
127
+ const policiesByRole = await this.rbacRepository_.listPoliciesForRoles(roleIds, sharedContext);
128
+ for (const role of roles) {
129
+ role.policies = policiesByRole.get(role.id) || [];
130
+ }
131
+ }
132
+ return [roles, count];
133
+ }
134
+ // @ts-expect-error
135
+ async createRbacRoleParents(data, sharedContext = {}) {
136
+ for (const parent of data) {
137
+ const { role_id, parent_id } = parent;
138
+ if (role_id === parent_id) {
139
+ throw new Error(`Cannot create role parent relationship: a role cannot be its own parent (role_id: ${role_id})`);
140
+ }
141
+ const wouldCreateCycle = await this.rbacRepository_.checkForCycle(role_id, parent_id, sharedContext);
142
+ if (wouldCreateCycle) {
143
+ throw new Error(`Cannot create role parent relationship: this would create a circular dependency (role_id: ${role_id}, parent_id: ${parent_id})`);
144
+ }
145
+ }
146
+ return await super.createRbacRoleParents(data, sharedContext);
147
+ }
148
+ // @ts-expect-error
149
+ async updateRbacRoleParents(data, sharedContext = {}) {
150
+ for (const parent of data) {
151
+ const { role_id, parent_id } = parent;
152
+ if (parent_id) {
153
+ if (role_id === parent_id) {
154
+ throw new Error(`Cannot update role parent relationship: a role cannot be its own parent (role_id: ${role_id})`);
155
+ }
156
+ const wouldCreateCycle = await this.rbacRepository_.checkForCycle(role_id, parent_id, sharedContext);
157
+ if (wouldCreateCycle) {
158
+ throw new Error(`Cannot update role parent relationship: this would create a circular dependency (role_id: ${role_id}, parent_id: ${parent_id})`);
159
+ }
160
+ }
161
+ }
162
+ return await super.updateRbacRoleParents(data, sharedContext);
163
+ }
164
+ }
165
+ exports.default = RbacModuleService;
166
+ __decorate([
167
+ (0, utils_1.InjectTransactionManager)(),
168
+ __param(0, (0, utils_1.AcmeKitContext)()),
169
+ __metadata("design:type", Function),
170
+ __metadata("design:paramtypes", [Object]),
171
+ __metadata("design:returntype", Promise)
172
+ ], RbacModuleService.prototype, "syncRegisteredPolicies", null);
173
+ __decorate([
174
+ (0, utils_1.InjectManager)(),
175
+ __param(1, (0, utils_1.AcmeKitContext)()),
176
+ __metadata("design:type", Function),
177
+ __metadata("design:paramtypes", [String, Object]),
178
+ __metadata("design:returntype", Promise)
179
+ ], RbacModuleService.prototype, "listPoliciesForRole", null);
180
+ __decorate([
181
+ (0, utils_1.InjectManager)()
182
+ // @ts-expect-error
183
+ ,
184
+ __param(2, (0, utils_1.AcmeKitContext)()),
185
+ __metadata("design:type", Function),
186
+ __metadata("design:paramtypes", [Object, Object, Object]),
187
+ __metadata("design:returntype", Promise)
188
+ ], RbacModuleService.prototype, "listRbacRoles", null);
189
+ __decorate([
190
+ (0, utils_1.InjectManager)()
191
+ // @ts-expect-error
192
+ ,
193
+ __param(2, (0, utils_1.AcmeKitContext)()),
194
+ __metadata("design:type", Function),
195
+ __metadata("design:paramtypes", [Object, Object, Object]),
196
+ __metadata("design:returntype", Promise)
197
+ ], RbacModuleService.prototype, "listAndCountRbacRoles", null);
198
+ __decorate([
199
+ (0, utils_1.InjectManager)()
200
+ // @ts-expect-error
201
+ ,
202
+ __param(1, (0, utils_1.AcmeKitContext)()),
203
+ __metadata("design:type", Function),
204
+ __metadata("design:paramtypes", [Array, Object]),
205
+ __metadata("design:returntype", Promise)
206
+ ], RbacModuleService.prototype, "createRbacRoleParents", null);
207
+ __decorate([
208
+ (0, utils_1.InjectManager)()
209
+ // @ts-expect-error
210
+ ,
211
+ __param(1, (0, utils_1.AcmeKitContext)()),
212
+ __metadata("design:type", Function),
213
+ __metadata("design:paramtypes", [Array, Object]),
214
+ __metadata("design:returntype", Promise)
215
+ ], RbacModuleService.prototype, "updateRbacRoleParents", null);
216
+ //# sourceMappingURL=rbac-module-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-module-service.js","sourceRoot":"","sources":["../../src/services/rbac-module-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"root":["../src/index.ts","../src/loaders/initial-data.ts","../src/migrations/migration20251219163509.ts","../src/models/index.ts","../src/models/rbac-policy.ts","../src/models/rbac-role-inheritance.ts","../src/models/rbac-role-parent.ts","../src/models/rbac-role-policy.ts","../src/models/rbac-role.ts","../src/repositories/index.ts","../src/repositories/rbac.ts","../src/services/index.ts","../src/services/rbac-module-service.ts","../src/types/index.ts"],"version":"5.9.3"}
@@ -0,0 +1,2 @@
1
+ export type RbacModuleOptions = Record<string, unknown>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}