@stratal/framework 0.0.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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +88 -0
  3. package/dist/auth/auth.module.d.ts +37 -0
  4. package/dist/auth/auth.module.d.ts.map +1 -0
  5. package/dist/auth/auth.module.js +74 -0
  6. package/dist/auth/auth.module.js.map +1 -0
  7. package/dist/auth/auth.tokens.d.ts +5 -0
  8. package/dist/auth/auth.tokens.d.ts.map +1 -0
  9. package/dist/auth/auth.tokens.js +5 -0
  10. package/dist/auth/auth.tokens.js.map +1 -0
  11. package/dist/auth/errors/auth-errors.d.ts +74 -0
  12. package/dist/auth/errors/auth-errors.d.ts.map +1 -0
  13. package/dist/auth/errors/auth-errors.js +122 -0
  14. package/dist/auth/errors/auth-errors.js.map +1 -0
  15. package/dist/auth/errors/index.d.ts +5 -0
  16. package/dist/auth/errors/index.d.ts.map +1 -0
  17. package/dist/auth/errors/index.js +5 -0
  18. package/dist/auth/errors/index.js.map +1 -0
  19. package/dist/auth/errors/invalid-token.error.d.ts +5 -0
  20. package/dist/auth/errors/invalid-token.error.d.ts.map +1 -0
  21. package/dist/auth/errors/invalid-token.error.js +7 -0
  22. package/dist/auth/errors/invalid-token.error.js.map +1 -0
  23. package/dist/auth/errors/token-required.error.d.ts +5 -0
  24. package/dist/auth/errors/token-required.error.d.ts.map +1 -0
  25. package/dist/auth/errors/token-required.error.js +7 -0
  26. package/dist/auth/errors/token-required.error.js.map +1 -0
  27. package/dist/auth/errors/verification-failed.error.d.ts +5 -0
  28. package/dist/auth/errors/verification-failed.error.d.ts.map +1 -0
  29. package/dist/auth/errors/verification-failed.error.js +7 -0
  30. package/dist/auth/errors/verification-failed.error.js.map +1 -0
  31. package/dist/auth/index.d.ts +7 -0
  32. package/dist/auth/index.d.ts.map +1 -0
  33. package/dist/auth/index.js +7 -0
  34. package/dist/auth/index.js.map +1 -0
  35. package/dist/auth/middleware/auth-context.middleware.d.ts +12 -0
  36. package/dist/auth/middleware/auth-context.middleware.d.ts.map +1 -0
  37. package/dist/auth/middleware/auth-context.middleware.js +28 -0
  38. package/dist/auth/middleware/auth-context.middleware.js.map +1 -0
  39. package/dist/auth/middleware/index.d.ts +3 -0
  40. package/dist/auth/middleware/index.d.ts.map +1 -0
  41. package/dist/auth/middleware/index.js +3 -0
  42. package/dist/auth/middleware/index.js.map +1 -0
  43. package/dist/auth/middleware/session-verification.middleware.d.ts +18 -0
  44. package/dist/auth/middleware/session-verification.middleware.d.ts.map +1 -0
  45. package/dist/auth/middleware/session-verification.middleware.js +48 -0
  46. package/dist/auth/middleware/session-verification.middleware.js.map +1 -0
  47. package/dist/auth/services/auth.service.d.ts +32 -0
  48. package/dist/auth/services/auth.service.d.ts.map +1 -0
  49. package/dist/auth/services/auth.service.js +62 -0
  50. package/dist/auth/services/auth.service.js.map +1 -0
  51. package/dist/auth/services/index.d.ts +2 -0
  52. package/dist/auth/services/index.d.ts.map +1 -0
  53. package/dist/auth/services/index.js +2 -0
  54. package/dist/auth/services/index.js.map +1 -0
  55. package/dist/auth/utils/auth-helpers.d.ts +11 -0
  56. package/dist/auth/utils/auth-helpers.d.ts.map +1 -0
  57. package/dist/auth/utils/auth-helpers.js +31 -0
  58. package/dist/auth/utils/auth-helpers.js.map +1 -0
  59. package/dist/auth/utils/better-auth-error-handler.d.ts +11 -0
  60. package/dist/auth/utils/better-auth-error-handler.d.ts.map +1 -0
  61. package/dist/auth/utils/better-auth-error-handler.js +95 -0
  62. package/dist/auth/utils/better-auth-error-handler.js.map +1 -0
  63. package/dist/auth/utils/index.d.ts +3 -0
  64. package/dist/auth/utils/index.d.ts.map +1 -0
  65. package/dist/auth/utils/index.js +3 -0
  66. package/dist/auth/utils/index.js.map +1 -0
  67. package/dist/context/auth-context.d.ts +35 -0
  68. package/dist/context/auth-context.d.ts.map +1 -0
  69. package/dist/context/auth-context.js +65 -0
  70. package/dist/context/auth-context.js.map +1 -0
  71. package/dist/context/errors/context-not-initialized.error.d.ts +5 -0
  72. package/dist/context/errors/context-not-initialized.error.d.ts.map +1 -0
  73. package/dist/context/errors/context-not-initialized.error.js +7 -0
  74. package/dist/context/errors/context-not-initialized.error.js.map +1 -0
  75. package/dist/context/errors/index.d.ts +4 -0
  76. package/dist/context/errors/index.d.ts.map +1 -0
  77. package/dist/context/errors/index.js +4 -0
  78. package/dist/context/errors/index.js.map +1 -0
  79. package/dist/context/errors/user-not-authenticated.error.d.ts +5 -0
  80. package/dist/context/errors/user-not-authenticated.error.d.ts.map +1 -0
  81. package/dist/context/errors/user-not-authenticated.error.js +7 -0
  82. package/dist/context/errors/user-not-authenticated.error.js.map +1 -0
  83. package/dist/context/errors/user-not-authorized.error.d.ts +5 -0
  84. package/dist/context/errors/user-not-authorized.error.d.ts.map +1 -0
  85. package/dist/context/errors/user-not-authorized.error.js +7 -0
  86. package/dist/context/errors/user-not-authorized.error.js.map +1 -0
  87. package/dist/context/index.d.ts +3 -0
  88. package/dist/context/index.d.ts.map +1 -0
  89. package/dist/context/index.js +3 -0
  90. package/dist/context/index.js.map +1 -0
  91. package/dist/database/custom-pg-types.d.ts +21 -0
  92. package/dist/database/custom-pg-types.d.ts.map +1 -0
  93. package/dist/database/custom-pg-types.js +41 -0
  94. package/dist/database/custom-pg-types.js.map +1 -0
  95. package/dist/database/database.helpers.d.ts +18 -0
  96. package/dist/database/database.helpers.d.ts.map +1 -0
  97. package/dist/database/database.helpers.js +27 -0
  98. package/dist/database/database.helpers.js.map +1 -0
  99. package/dist/database/database.module.d.ts +21 -0
  100. package/dist/database/database.module.d.ts.map +1 -0
  101. package/dist/database/database.module.js +62 -0
  102. package/dist/database/database.module.js.map +1 -0
  103. package/dist/database/database.service.d.ts +18 -0
  104. package/dist/database/database.service.d.ts.map +1 -0
  105. package/dist/database/database.service.js +2 -0
  106. package/dist/database/database.service.js.map +1 -0
  107. package/dist/database/database.tokens.d.ts +6 -0
  108. package/dist/database/database.tokens.d.ts.map +1 -0
  109. package/dist/database/database.tokens.js +8 -0
  110. package/dist/database/database.tokens.js.map +1 -0
  111. package/dist/database/decorators/inject-db.decorator.d.ts +3 -0
  112. package/dist/database/decorators/inject-db.decorator.d.ts.map +1 -0
  113. package/dist/database/decorators/inject-db.decorator.js +6 -0
  114. package/dist/database/decorators/inject-db.decorator.js.map +1 -0
  115. package/dist/database/errors/database-config.error.d.ts +5 -0
  116. package/dist/database/errors/database-config.error.d.ts.map +1 -0
  117. package/dist/database/errors/database-config.error.js +8 -0
  118. package/dist/database/errors/database-config.error.js.map +1 -0
  119. package/dist/database/errors/database-error.d.ts +14 -0
  120. package/dist/database/errors/database-error.d.ts.map +1 -0
  121. package/dist/database/errors/database-error.js +20 -0
  122. package/dist/database/errors/database-error.js.map +1 -0
  123. package/dist/database/errors/foreign-key-constraint.error.d.ts +14 -0
  124. package/dist/database/errors/foreign-key-constraint.error.d.ts.map +1 -0
  125. package/dist/database/errors/foreign-key-constraint.error.js +19 -0
  126. package/dist/database/errors/foreign-key-constraint.error.js.map +1 -0
  127. package/dist/database/errors/from-zenstack-error.d.ts +22 -0
  128. package/dist/database/errors/from-zenstack-error.d.ts.map +1 -0
  129. package/dist/database/errors/from-zenstack-error.js +114 -0
  130. package/dist/database/errors/from-zenstack-error.js.map +1 -0
  131. package/dist/database/errors/index.d.ts +8 -0
  132. package/dist/database/errors/index.d.ts.map +1 -0
  133. package/dist/database/errors/index.js +8 -0
  134. package/dist/database/errors/index.js.map +1 -0
  135. package/dist/database/errors/invalid-error-code-range.error.d.ts +12 -0
  136. package/dist/database/errors/invalid-error-code-range.error.d.ts.map +1 -0
  137. package/dist/database/errors/invalid-error-code-range.error.js +14 -0
  138. package/dist/database/errors/invalid-error-code-range.error.js.map +1 -0
  139. package/dist/database/errors/record-not-found.error.d.ts +15 -0
  140. package/dist/database/errors/record-not-found.error.d.ts.map +1 -0
  141. package/dist/database/errors/record-not-found.error.js +20 -0
  142. package/dist/database/errors/record-not-found.error.js.map +1 -0
  143. package/dist/database/errors/unique-constraint.error.d.ts +15 -0
  144. package/dist/database/errors/unique-constraint.error.d.ts.map +1 -0
  145. package/dist/database/errors/unique-constraint.error.js +20 -0
  146. package/dist/database/errors/unique-constraint.error.js.map +1 -0
  147. package/dist/database/event-types.d.ts +144 -0
  148. package/dist/database/event-types.d.ts.map +1 -0
  149. package/dist/database/event-types.js +13 -0
  150. package/dist/database/event-types.js.map +1 -0
  151. package/dist/database/index.d.ts +10 -0
  152. package/dist/database/index.d.ts.map +1 -0
  153. package/dist/database/index.js +10 -0
  154. package/dist/database/index.js.map +1 -0
  155. package/dist/database/plugins/error-handler.plugin.d.ts +21 -0
  156. package/dist/database/plugins/error-handler.plugin.d.ts.map +1 -0
  157. package/dist/database/plugins/error-handler.plugin.js +24 -0
  158. package/dist/database/plugins/error-handler.plugin.js.map +1 -0
  159. package/dist/database/plugins/event-emitter.plugin.d.ts +37 -0
  160. package/dist/database/plugins/event-emitter.plugin.d.ts.map +1 -0
  161. package/dist/database/plugins/event-emitter.plugin.js +43 -0
  162. package/dist/database/plugins/event-emitter.plugin.js.map +1 -0
  163. package/dist/database/plugins/index.d.ts +4 -0
  164. package/dist/database/plugins/index.d.ts.map +1 -0
  165. package/dist/database/plugins/index.js +4 -0
  166. package/dist/database/plugins/index.js.map +1 -0
  167. package/dist/database/plugins/schema-switcher.plugin.d.ts +32 -0
  168. package/dist/database/plugins/schema-switcher.plugin.d.ts.map +1 -0
  169. package/dist/database/plugins/schema-switcher.plugin.js +27 -0
  170. package/dist/database/plugins/schema-switcher.plugin.js.map +1 -0
  171. package/dist/database/types.d.ts +51 -0
  172. package/dist/database/types.d.ts.map +1 -0
  173. package/dist/database/types.js +2 -0
  174. package/dist/database/types.js.map +1 -0
  175. package/dist/factory/factory.d.ts +56 -0
  176. package/dist/factory/factory.d.ts.map +1 -0
  177. package/dist/factory/factory.js +86 -0
  178. package/dist/factory/factory.js.map +1 -0
  179. package/dist/factory/index.d.ts +3 -0
  180. package/dist/factory/index.d.ts.map +1 -0
  181. package/dist/factory/index.js +3 -0
  182. package/dist/factory/index.js.map +1 -0
  183. package/dist/factory/sequence.d.ts +38 -0
  184. package/dist/factory/sequence.d.ts.map +1 -0
  185. package/dist/factory/sequence.js +54 -0
  186. package/dist/factory/sequence.js.map +1 -0
  187. package/dist/guards/auth.guard.d.ts +33 -0
  188. package/dist/guards/auth.guard.d.ts.map +1 -0
  189. package/dist/guards/auth.guard.js +99 -0
  190. package/dist/guards/auth.guard.js.map +1 -0
  191. package/dist/guards/index.d.ts +3 -0
  192. package/dist/guards/index.d.ts.map +1 -0
  193. package/dist/guards/index.js +5 -0
  194. package/dist/guards/index.js.map +1 -0
  195. package/dist/index.d.ts +3 -0
  196. package/dist/index.d.ts.map +1 -0
  197. package/dist/index.js +2 -0
  198. package/dist/index.js.map +1 -0
  199. package/dist/rbac/adapters/custom-zenstack-adapter.d.ts +61 -0
  200. package/dist/rbac/adapters/custom-zenstack-adapter.d.ts.map +1 -0
  201. package/dist/rbac/adapters/custom-zenstack-adapter.js +159 -0
  202. package/dist/rbac/adapters/custom-zenstack-adapter.js.map +1 -0
  203. package/dist/rbac/adapters/index.d.ts +2 -0
  204. package/dist/rbac/adapters/index.d.ts.map +1 -0
  205. package/dist/rbac/adapters/index.js +2 -0
  206. package/dist/rbac/adapters/index.js.map +1 -0
  207. package/dist/rbac/constants.d.ts +8 -0
  208. package/dist/rbac/constants.d.ts.map +1 -0
  209. package/dist/rbac/constants.js +8 -0
  210. package/dist/rbac/constants.js.map +1 -0
  211. package/dist/rbac/errors/index.d.ts +2 -0
  212. package/dist/rbac/errors/index.d.ts.map +1 -0
  213. package/dist/rbac/errors/index.js +2 -0
  214. package/dist/rbac/errors/index.js.map +1 -0
  215. package/dist/rbac/errors/insufficient-permissions.error.d.ts +14 -0
  216. package/dist/rbac/errors/insufficient-permissions.error.d.ts.map +1 -0
  217. package/dist/rbac/errors/insufficient-permissions.error.js +19 -0
  218. package/dist/rbac/errors/insufficient-permissions.error.js.map +1 -0
  219. package/dist/rbac/index.d.ts +9 -0
  220. package/dist/rbac/index.d.ts.map +1 -0
  221. package/dist/rbac/index.js +8 -0
  222. package/dist/rbac/index.js.map +1 -0
  223. package/dist/rbac/rbac.module.d.ts +26 -0
  224. package/dist/rbac/rbac.module.d.ts.map +1 -0
  225. package/dist/rbac/rbac.module.js +62 -0
  226. package/dist/rbac/rbac.module.js.map +1 -0
  227. package/dist/rbac/services/casbin-enforcer.service.d.ts +37 -0
  228. package/dist/rbac/services/casbin-enforcer.service.d.ts.map +1 -0
  229. package/dist/rbac/services/casbin-enforcer.service.js +86 -0
  230. package/dist/rbac/services/casbin-enforcer.service.js.map +1 -0
  231. package/dist/rbac/services/casbin.service.d.ts +37 -0
  232. package/dist/rbac/services/casbin.service.d.ts.map +1 -0
  233. package/dist/rbac/services/casbin.service.js +174 -0
  234. package/dist/rbac/services/casbin.service.js.map +1 -0
  235. package/dist/rbac/services/index.d.ts +3 -0
  236. package/dist/rbac/services/index.d.ts.map +1 -0
  237. package/dist/rbac/services/index.js +3 -0
  238. package/dist/rbac/services/index.js.map +1 -0
  239. package/dist/rbac/tokens.d.ts +10 -0
  240. package/dist/rbac/tokens.d.ts.map +1 -0
  241. package/dist/rbac/tokens.js +10 -0
  242. package/dist/rbac/tokens.js.map +1 -0
  243. package/dist/rbac/types.d.ts +12 -0
  244. package/dist/rbac/types.d.ts.map +1 -0
  245. package/dist/rbac/types.js +2 -0
  246. package/dist/rbac/types.js.map +1 -0
  247. package/package.json +118 -0
@@ -0,0 +1,159 @@
1
+ import { Helper } from 'casbin';
2
+ /**
3
+ * Custom ZenStack adapter for Casbin that works with Cloudflare Workers.
4
+ *
5
+ * Based on the original casbin-prisma-adapter but modified to:
6
+ * - Work with ZenStack v3 ORM clients
7
+ * - Avoid bundling errors in Cloudflare Workers
8
+ * - Accept pre-connected ZenStack clients (request-scoped)
9
+ */
10
+ export class CustomZenStackAdapter {
11
+ #db;
12
+ filtered = false;
13
+ isFiltered() {
14
+ return this.filtered;
15
+ }
16
+ enableFiltered(enabled) {
17
+ this.filtered = enabled;
18
+ }
19
+ constructor(db) {
20
+ this.#db = db;
21
+ }
22
+ async loadPolicy(model) {
23
+ const lines = await this.#db.casbinRule.findMany();
24
+ for (const line of lines) {
25
+ this.#loadPolicyLine(line, model);
26
+ }
27
+ }
28
+ async loadFilteredPolicy(model, filter) {
29
+ const whereFilter = Object.keys(filter)
30
+ .map((ptype) => {
31
+ const policyPatterns = filter[ptype];
32
+ return policyPatterns.map((policyPattern) => {
33
+ return {
34
+ ptype,
35
+ ...(policyPattern[0] && { v0: policyPattern[0] }),
36
+ ...(policyPattern[1] && { v1: policyPattern[1] }),
37
+ ...(policyPattern[2] && { v2: policyPattern[2] }),
38
+ ...(policyPattern[3] && { v3: policyPattern[3] }),
39
+ ...(policyPattern[4] && { v4: policyPattern[4] }),
40
+ ...(policyPattern[5] && { v5: policyPattern[5] }),
41
+ };
42
+ });
43
+ })
44
+ .flat();
45
+ const lines = await this.#db.casbinRule.findMany({
46
+ where: {
47
+ OR: whereFilter,
48
+ },
49
+ });
50
+ lines.forEach((line) => this.#loadPolicyLine(line, model));
51
+ this.enableFiltered(true);
52
+ }
53
+ async savePolicy(model) {
54
+ await this.#db.$executeRawUnsafe('DELETE FROM casbin_rule');
55
+ const lines = [];
56
+ const savePolicyType = (ptype) => {
57
+ const astMap = model.model.get(ptype);
58
+ if (astMap) {
59
+ for (const [ptype, ast] of astMap) {
60
+ for (const rule of ast.policy) {
61
+ const line = this.#savePolicyLine(ptype, rule);
62
+ lines.push(line);
63
+ }
64
+ }
65
+ }
66
+ };
67
+ savePolicyType('p');
68
+ savePolicyType('g');
69
+ await this.#db.casbinRule.createMany({ data: lines });
70
+ return true;
71
+ }
72
+ async addPolicy(_sec, ptype, rule) {
73
+ const line = this.#savePolicyLine(ptype, rule);
74
+ await this.#db.casbinRule.create({ data: line });
75
+ }
76
+ async addPolicies(_sec, ptype, rules) {
77
+ const processes = [];
78
+ for (const rule of rules) {
79
+ const line = this.#savePolicyLine(ptype, rule);
80
+ const p = this.#db.casbinRule.create({ data: line });
81
+ processes.push(p);
82
+ }
83
+ await Promise.all(processes);
84
+ }
85
+ async removePolicy(_sec, ptype, rule) {
86
+ const line = this.#savePolicyLine(ptype, rule);
87
+ await this.#db.casbinRule.deleteMany({ where: line });
88
+ }
89
+ async removePolicies(_sec, ptype, rules) {
90
+ const processes = [];
91
+ for (const rule of rules) {
92
+ const line = this.#savePolicyLine(ptype, rule);
93
+ const p = this.#db.casbinRule.deleteMany({ where: line });
94
+ processes.push(p);
95
+ }
96
+ await Promise.all(processes);
97
+ }
98
+ async removeFilteredPolicy(_sec, ptype, fieldIndex, ...fieldValues) {
99
+ const line = { ptype };
100
+ const idx = fieldIndex + fieldValues.length;
101
+ if (fieldIndex <= 0 && 0 < idx) {
102
+ line.v0 = fieldValues[0 - fieldIndex];
103
+ }
104
+ if (fieldIndex <= 1 && 1 < idx) {
105
+ line.v1 = fieldValues[1 - fieldIndex];
106
+ }
107
+ if (fieldIndex <= 2 && 2 < idx) {
108
+ line.v2 = fieldValues[2 - fieldIndex];
109
+ }
110
+ if (fieldIndex <= 3 && 3 < idx) {
111
+ line.v3 = fieldValues[3 - fieldIndex];
112
+ }
113
+ if (fieldIndex <= 4 && 4 < idx) {
114
+ line.v4 = fieldValues[4 - fieldIndex];
115
+ }
116
+ if (fieldIndex <= 5 && 5 < idx) {
117
+ line.v5 = fieldValues[5 - fieldIndex];
118
+ }
119
+ await this.#db.casbinRule.deleteMany({ where: line });
120
+ }
121
+ async close() {
122
+ // No-op: ZenStack uses pg.Pool for connection management
123
+ }
124
+ static newAdapter(db) {
125
+ const adapter = new CustomZenStackAdapter(db);
126
+ return adapter;
127
+ }
128
+ #loadPolicyLine = (line, model) => {
129
+ const result = line.ptype +
130
+ ', ' +
131
+ [line.v0, line.v1, line.v2, line.v3, line.v4, line.v5]
132
+ .filter((n) => n)
133
+ .join(', ');
134
+ Helper.loadPolicyLine(result, model);
135
+ };
136
+ #savePolicyLine = (ptype, rule) => {
137
+ const line = { ptype };
138
+ if (rule.length > 0) {
139
+ line.v0 = rule[0];
140
+ }
141
+ if (rule.length > 1) {
142
+ line.v1 = rule[1];
143
+ }
144
+ if (rule.length > 2) {
145
+ line.v2 = rule[2];
146
+ }
147
+ if (rule.length > 3) {
148
+ line.v3 = rule[3];
149
+ }
150
+ if (rule.length > 4) {
151
+ line.v4 = rule[4];
152
+ }
153
+ if (rule.length > 5) {
154
+ line.v5 = rule[5];
155
+ }
156
+ return line;
157
+ };
158
+ }
159
+ //# sourceMappingURL=custom-zenstack-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-zenstack-adapter.js","sourceRoot":"","sources":["../../../src/rbac/adapters/custom-zenstack-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './custom-zenstack-adapter';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rbac/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './custom-zenstack-adapter';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rbac/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * RBAC Constants
3
+ */
4
+ export declare const RBAC_CONTEXT_KEYS: {
5
+ /** Key for storing required authorization scopes (permissions) in context */
6
+ readonly AUTH_SCOPES: symbol;
7
+ };
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/rbac/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B,6EAA6E;;CAErE,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * RBAC Constants
3
+ */
4
+ export const RBAC_CONTEXT_KEYS = {
5
+ /** Key for storing required authorization scopes (permissions) in context */
6
+ AUTH_SCOPES: Symbol('rbac:authScopes'),
7
+ };
8
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/rbac/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC,iBAAiB,CAAC;CAC9B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './insufficient-permissions.error';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rbac/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './insufficient-permissions.error';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rbac/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { ApplicationError } from 'stratal/errors';
2
+ /**
3
+ * InsufficientPermissionsError
4
+ *
5
+ * Thrown when a user attempts to perform an action without the required permissions.
6
+ * This error is used by the auth guard after authorization check fails.
7
+ *
8
+ * HTTP Status: 403 Forbidden
9
+ * Error Code: 3102 (AUTHZ.INSUFFICIENT_PERMISSIONS)
10
+ */
11
+ export declare class InsufficientPermissionsError extends ApplicationError {
12
+ constructor(requiredScopes: string[], userId?: string);
13
+ }
14
+ //# sourceMappingURL=insufficient-permissions.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insufficient-permissions.error.d.ts","sourceRoot":"","sources":["../../../src/rbac/errors/insufficient-permissions.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAA;AAE9D;;;;;;;;GAQG;AACH,qBAAa,4BAA6B,SAAQ,gBAAgB;gBACpD,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM;CAMtD"}
@@ -0,0 +1,19 @@
1
+ import { ApplicationError, ERROR_CODES } from 'stratal/errors';
2
+ /**
3
+ * InsufficientPermissionsError
4
+ *
5
+ * Thrown when a user attempts to perform an action without the required permissions.
6
+ * This error is used by the auth guard after authorization check fails.
7
+ *
8
+ * HTTP Status: 403 Forbidden
9
+ * Error Code: 3102 (AUTHZ.INSUFFICIENT_PERMISSIONS)
10
+ */
11
+ export class InsufficientPermissionsError extends ApplicationError {
12
+ constructor(requiredScopes, userId) {
13
+ super('errors.insufficientPermissions', ERROR_CODES.AUTHZ.INSUFFICIENT_PERMISSIONS, {
14
+ requiredScopes: requiredScopes.join(', '),
15
+ userId: userId ?? 'unknown',
16
+ });
17
+ }
18
+ }
19
+ //# sourceMappingURL=insufficient-permissions.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insufficient-permissions.error.js","sourceRoot":"","sources":["../../../src/rbac/errors/insufficient-permissions.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE9D;;;;;;;;GAQG;AACH,MAAM,OAAO,4BAA6B,SAAQ,gBAAgB;IAChE,YAAY,cAAwB,EAAE,MAAe;QACnD,KAAK,CAAC,gCAAgC,EAAE,WAAW,CAAC,KAAK,CAAC,wBAAwB,EAAE;YAClF,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,MAAM,EAAE,MAAM,IAAI,SAAS;SAC5B,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export { RBAC_CONTEXT_KEYS } from './constants';
2
+ export { InsufficientPermissionsError } from './errors/insufficient-permissions.error';
3
+ export { CasbinEnforcerService } from './services/casbin-enforcer.service';
4
+ export { CasbinService } from './services/casbin.service';
5
+ export { CustomZenStackAdapter } from './adapters/custom-zenstack-adapter';
6
+ export { RbacModule } from './rbac.module';
7
+ export { RBAC_TOKENS } from './tokens';
8
+ export type { RbacModuleOptions } from './types';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAA;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,8 @@
1
+ export { RBAC_CONTEXT_KEYS } from './constants';
2
+ export { InsufficientPermissionsError } from './errors/insufficient-permissions.error';
3
+ export { CasbinEnforcerService } from './services/casbin-enforcer.service';
4
+ export { CasbinService } from './services/casbin.service';
5
+ export { CustomZenStackAdapter } from './adapters/custom-zenstack-adapter';
6
+ export { RbacModule } from './rbac.module';
7
+ export { RBAC_TOKENS } from './tokens';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAA;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,26 @@
1
+ import type { AsyncModuleOptions, DynamicModule } from 'stratal/module';
2
+ import type { RbacModuleOptions } from './types';
3
+ /**
4
+ * RBAC Module
5
+ *
6
+ * Provides role-based access control using Casbin.
7
+ * Fully configurable — no hardcoded roles, policies, or model.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * @Module({
12
+ * imports: [
13
+ * RbacModule.forRoot({
14
+ * model: MY_RBAC_MODEL,
15
+ * defaultPolicies: [['admin', 'users:*', '.*']],
16
+ * roleHierarchy: [['super_admin', 'admin']],
17
+ * })
18
+ * ]
19
+ * })
20
+ * ```
21
+ */
22
+ export declare class RbacModule {
23
+ static forRoot(options: RbacModuleOptions): DynamicModule;
24
+ static forRootAsync(options: AsyncModuleOptions<RbacModuleOptions>): DynamicModule;
25
+ }
26
+ //# sourceMappingURL=rbac.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.module.d.ts","sourceRoot":"","sources":["../../src/rbac/rbac.module.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAIvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAMa,UAAU;IACrB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa;IASzD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,aAAa;CAYnF"}
@@ -0,0 +1,62 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var RbacModule_1;
8
+ import { Module } from 'stratal/module';
9
+ import { CasbinEnforcerService } from './services/casbin-enforcer.service';
10
+ import { CasbinService } from './services/casbin.service';
11
+ import { RBAC_TOKENS } from './tokens';
12
+ /**
13
+ * RBAC Module
14
+ *
15
+ * Provides role-based access control using Casbin.
16
+ * Fully configurable — no hardcoded roles, policies, or model.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * @Module({
21
+ * imports: [
22
+ * RbacModule.forRoot({
23
+ * model: MY_RBAC_MODEL,
24
+ * defaultPolicies: [['admin', 'users:*', '.*']],
25
+ * roleHierarchy: [['super_admin', 'admin']],
26
+ * })
27
+ * ]
28
+ * })
29
+ * ```
30
+ */
31
+ let RbacModule = RbacModule_1 = class RbacModule {
32
+ static forRoot(options) {
33
+ return {
34
+ module: RbacModule_1,
35
+ providers: [
36
+ { provide: RBAC_TOKENS.Options, useValue: options },
37
+ ],
38
+ };
39
+ }
40
+ static forRootAsync(options) {
41
+ return {
42
+ module: RbacModule_1,
43
+ providers: [
44
+ {
45
+ provide: RBAC_TOKENS.Options,
46
+ useFactory: options.useFactory,
47
+ inject: options.inject,
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ };
53
+ RbacModule = RbacModule_1 = __decorate([
54
+ Module({
55
+ providers: [
56
+ CasbinEnforcerService,
57
+ { provide: RBAC_TOKENS.CasbinService, useClass: CasbinService },
58
+ ],
59
+ })
60
+ ], RbacModule);
61
+ export { RbacModule };
62
+ //# sourceMappingURL=rbac.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.module.js","sourceRoot":"","sources":["../../src/rbac/rbac.module.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtC;;;;;;;;;;;;;;;;;;GAkBG;AAOI,IAAM,UAAU,kBAAhB,MAAM,UAAU;IACrB,MAAM,CAAC,OAAO,CAAC,OAA0B;QACvC,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAA4B,EAAE;aACzE;SACF,CAAA;IACH,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAA8C;QAChE,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,WAAW,CAAC,OAAO;oBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB;aACF;SACF,CAAA;IACH,CAAC;CACF,CAAA;AAtBY,UAAU;IANtB,MAAM,CAAC;QACN,SAAS,EAAE;YACT,qBAAqB;YACrB,EAAE,OAAO,EAAE,WAAW,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE;SAChE;KACF,CAAC;GACW,UAAU,CAsBtB"}
@@ -0,0 +1,37 @@
1
+ import { type Enforcer } from 'casbin';
2
+ import { type CasbinDbClient } from '../adapters/custom-zenstack-adapter';
3
+ import type { RbacModuleOptions } from '../types';
4
+ /**
5
+ * CasbinEnforcerService
6
+ *
7
+ * Manages the Casbin enforcer instance for authorization.
8
+ * Model, default policies, and role hierarchy are provided via DI options.
9
+ */
10
+ export declare class CasbinEnforcerService {
11
+ protected readonly db: CasbinDbClient;
12
+ protected readonly options: RbacModuleOptions;
13
+ protected enforcer: Enforcer | null;
14
+ constructor(db: CasbinDbClient, options: RbacModuleOptions);
15
+ /**
16
+ * Get or create the enforcer instance
17
+ */
18
+ getEnforcer(): Promise<Enforcer>;
19
+ /**
20
+ * Create a new enforcer instance.
21
+ * Can be overridden by subclasses to customize enforcer creation.
22
+ */
23
+ protected createEnforcer(): Promise<Enforcer>;
24
+ /**
25
+ * Seed default policies into database
26
+ */
27
+ seedPolicies(): Promise<void>;
28
+ /**
29
+ * Clear cached enforcer instance
30
+ */
31
+ clearCache(): void;
32
+ /**
33
+ * Seed role hierarchy into database
34
+ */
35
+ seedRoleHierarchy(): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=casbin-enforcer.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"casbin-enforcer.service.d.ts","sourceRoot":"","sources":["../../../src/rbac/services/casbin-enforcer.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAG7E,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,qCAAqC,CAAA;AAEhG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEjD;;;;;GAKG;AACH,qBACa,qBAAqB;IAK9B,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc;IAErC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB;IAN/C,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAO;gBAIrB,EAAE,EAAE,cAAc,EAElB,OAAO,EAAE,iBAAiB;IAG/C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAKtC;;;OAGG;cACa,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC;IASnD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAUzC"}
@@ -0,0 +1,86 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { newCachedEnforcer, newModelFromString } from 'casbin';
14
+ import { DI_TOKENS, Transient } from 'stratal/di';
15
+ import { inject } from 'tsyringe';
16
+ import { CustomZenStackAdapter } from '../adapters/custom-zenstack-adapter';
17
+ import { RBAC_TOKENS } from '../tokens';
18
+ /**
19
+ * CasbinEnforcerService
20
+ *
21
+ * Manages the Casbin enforcer instance for authorization.
22
+ * Model, default policies, and role hierarchy are provided via DI options.
23
+ */
24
+ let CasbinEnforcerService = class CasbinEnforcerService {
25
+ db;
26
+ options;
27
+ enforcer = null;
28
+ constructor(db, options) {
29
+ this.db = db;
30
+ this.options = options;
31
+ }
32
+ /**
33
+ * Get or create the enforcer instance
34
+ */
35
+ async getEnforcer() {
36
+ this.enforcer ??= await this.createEnforcer();
37
+ return this.enforcer;
38
+ }
39
+ /**
40
+ * Create a new enforcer instance.
41
+ * Can be overridden by subclasses to customize enforcer creation.
42
+ */
43
+ async createEnforcer() {
44
+ const model = newModelFromString(this.options.model);
45
+ const adapter = CustomZenStackAdapter.newAdapter(this.db);
46
+ const enforcer = await newCachedEnforcer(model, adapter);
47
+ await enforcer.loadPolicy();
48
+ return enforcer;
49
+ }
50
+ /**
51
+ * Seed default policies into database
52
+ */
53
+ async seedPolicies() {
54
+ const enforcer = await this.getEnforcer();
55
+ const policies = this.options.defaultPolicies ?? [];
56
+ for (const [role, resource, action] of policies) {
57
+ await enforcer.addPolicy(role, resource, action);
58
+ }
59
+ await enforcer.savePolicy();
60
+ }
61
+ /**
62
+ * Clear cached enforcer instance
63
+ */
64
+ clearCache() {
65
+ this.enforcer = null;
66
+ }
67
+ /**
68
+ * Seed role hierarchy into database
69
+ */
70
+ async seedRoleHierarchy() {
71
+ const enforcer = await this.getEnforcer();
72
+ const hierarchy = this.options.roleHierarchy ?? [];
73
+ for (const [childRole, parentRole] of hierarchy) {
74
+ await enforcer.addGroupingPolicy(childRole, parentRole);
75
+ }
76
+ await enforcer.savePolicy();
77
+ }
78
+ };
79
+ CasbinEnforcerService = __decorate([
80
+ Transient(),
81
+ __param(0, inject(DI_TOKENS.Database)),
82
+ __param(1, inject(RBAC_TOKENS.Options)),
83
+ __metadata("design:paramtypes", [Object, Object])
84
+ ], CasbinEnforcerService);
85
+ export { CasbinEnforcerService };
86
+ //# sourceMappingURL=casbin-enforcer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"casbin-enforcer.service.js","sourceRoot":"","sources":["../../../src/rbac/services/casbin-enforcer.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAiB,MAAM,QAAQ,CAAA;AAC7E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,qBAAqB,EAAuB,MAAM,qCAAqC,CAAA;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAGvC;;;;;GAKG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAKX;IAEA;IANX,QAAQ,GAAoB,IAAI,CAAA;IAE1C,YAEqB,EAAkB,EAElB,OAA0B;QAF1B,OAAE,GAAF,EAAE,CAAgB;QAElB,YAAO,GAAP,OAAO,CAAmB;IAC3C,CAAC;IAEL;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,cAAc;QAC5B,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAEpD,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACxD,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;QAC3B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAA;QAEnD,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YAChD,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAA;QAElD,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,SAAS,EAAE,CAAC;YAChD,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QACzD,CAAC;QAED,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;IAC7B,CAAC;CACF,CAAA;AAjEY,qBAAqB;IADjC,SAAS,EAAE;IAKP,WAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAE1B,WAAA,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;;GANnB,qBAAqB,CAiEjC"}
@@ -0,0 +1,37 @@
1
+ import type { Enforcer } from 'casbin';
2
+ import type { AuthContext } from '../../context/auth-context';
3
+ import { CasbinEnforcerService } from './casbin-enforcer.service';
4
+ /**
5
+ * CasbinService
6
+ *
7
+ * Request-scoped service that provides the full Casbin RBAC API.
8
+ * Uses AuthContext to get the current user.
9
+ */
10
+ export declare class CasbinService {
11
+ protected readonly context: AuthContext;
12
+ protected readonly enforcerService: CasbinEnforcerService;
13
+ constructor(context: AuthContext, enforcerService: CasbinEnforcerService);
14
+ protected getEnforcer(): Promise<Enforcer>;
15
+ addRoleForUser(userId: string, role: string): Promise<boolean>;
16
+ deleteRoleForUser(userId: string, role: string): Promise<boolean>;
17
+ deleteRolesForUser(userId: string): Promise<boolean>;
18
+ getRolesForUser(userId: string): Promise<string[]>;
19
+ getImplicitRolesForUser(userId: string): Promise<string[]>;
20
+ getUsersForRole(role: string): Promise<string[]>;
21
+ getImplicitUsersForRole(role: string): Promise<string[]>;
22
+ hasRoleForUser(userId: string, role: string): Promise<boolean>;
23
+ addRoleInheritance(childRole: string, parentRole: string): Promise<boolean>;
24
+ deleteRoleInheritance(childRole: string, parentRole: string): Promise<boolean>;
25
+ deleteUser(userId: string): Promise<boolean>;
26
+ deleteRole(role: string): Promise<boolean>;
27
+ getCurrentUserRoles(): Promise<string[]>;
28
+ currentUserHasRole(role: string): Promise<boolean>;
29
+ setRolesForUser(userId: string, roles: string[]): Promise<void>;
30
+ hasPermission(userId: string, scope: string, action: string): Promise<boolean>;
31
+ currentUserHasPermission(scope: string, action: string): Promise<boolean>;
32
+ hasAnyPermission(userId: string, scopes: string[], action: string): Promise<boolean>;
33
+ currentUserHasAnyPermission(scopes: string[], action: string): Promise<boolean>;
34
+ getPermissionsForUserAsCasbinJs(userId: string): Promise<Record<string, string[]>>;
35
+ getCurrentUserPermissionsAsCasbinJs(): Promise<Record<string, string[]>>;
36
+ }
37
+ //# sourceMappingURL=casbin.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"casbin.service.d.ts","sourceRoot":"","sources":["../../../src/rbac/services/casbin.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEjE;;;;;GAKG;AACH,qBACa,aAAa;IAGtB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW;IAEvC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,qBAAqB;gBAFtC,OAAO,EAAE,WAAW,EAEpB,eAAe,EAAE,qBAAqB;cAG3C,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAM1C,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO9D,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOjE,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpD,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1D,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKhD,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO9D,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3E,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO5C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAMxC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlD,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/D,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9E,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMzE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOpF,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ/E,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAelF,mCAAmC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAK/E"}