@decaf-ts/integrations 0.3.5 → 0.3.7

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 (272) hide show
  1. package/dist/integrations.cjs +1608 -7
  2. package/dist/integrations.js +1841 -5
  3. package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +13 -5
  4. package/lib/cjs/graph/nodes/base.cjs +35 -0
  5. package/lib/cjs/graph/nodes/flow-control.cjs +31 -3
  6. package/lib/cjs/graph/nodes/index.cjs +3 -2
  7. package/lib/cjs/graph/types.cjs +2 -2
  8. package/lib/cjs/index.cjs +6 -5
  9. package/lib/cjs/namespaces/index.cjs +26 -0
  10. package/lib/cjs/namespaces/models/authorization-model.cjs +12 -0
  11. package/lib/cjs/namespaces/models/effective-permission.model.cjs +95 -0
  12. package/lib/cjs/namespaces/models/group-membership.model.cjs +66 -0
  13. package/lib/cjs/namespaces/models/group.model.cjs +74 -0
  14. package/lib/cjs/namespaces/models/index.cjs +39 -0
  15. package/lib/cjs/namespaces/models/inheritance-block.model.cjs +76 -0
  16. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +66 -0
  17. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +73 -0
  18. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +64 -0
  19. package/lib/cjs/namespaces/models/org-unit.model.cjs +102 -0
  20. package/lib/cjs/namespaces/models/permission.model.cjs +64 -0
  21. package/lib/cjs/namespaces/models/principal.model.cjs +77 -0
  22. package/lib/cjs/namespaces/models/protected-resource.model.cjs +99 -0
  23. package/lib/cjs/namespaces/models/resource-grant.model.cjs +88 -0
  24. package/lib/cjs/namespaces/models/role-assignment.model.cjs +98 -0
  25. package/lib/cjs/namespaces/models/role-permission.model.cjs +55 -0
  26. package/lib/cjs/namespaces/models/role.model.cjs +84 -0
  27. package/lib/cjs/namespaces/models/storage-binding.model.cjs +85 -0
  28. package/lib/cjs/namespaces/models/tenant-membership.model.cjs +67 -0
  29. package/lib/cjs/namespaces/models/tenant-profile.model.cjs +64 -0
  30. package/lib/cjs/namespaces/models/tenant.model.cjs +88 -0
  31. package/lib/cjs/namespaces/models/user.model.cjs +75 -0
  32. package/lib/cjs/namespaces/org-based-authorization-system.cjs +286 -0
  33. package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +968 -0
  34. package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +1046 -0
  35. package/lib/cjs/namespaces/services/authz.service.cjs +76 -0
  36. package/lib/cjs/namespaces/services/bootstrap.service.cjs +112 -0
  37. package/lib/cjs/namespaces/services/effective-permission.service.cjs +150 -0
  38. package/lib/cjs/namespaces/services/group-membership.service.cjs +42 -0
  39. package/lib/cjs/namespaces/services/group.service.cjs +30 -0
  40. package/lib/cjs/namespaces/services/index.cjs +42 -0
  41. package/lib/cjs/namespaces/services/inheritance-block.service.cjs +32 -0
  42. package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +55 -0
  43. package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +34 -0
  44. package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +23 -0
  45. package/lib/cjs/namespaces/services/org-unit.service.cjs +160 -0
  46. package/lib/cjs/namespaces/services/permission.service.cjs +29 -0
  47. package/lib/cjs/namespaces/services/principal.service.cjs +35 -0
  48. package/lib/cjs/namespaces/services/protected-resource.service.cjs +43 -0
  49. package/lib/cjs/namespaces/services/resource-grant.service.cjs +45 -0
  50. package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +24 -0
  51. package/lib/cjs/namespaces/services/role-assignment.service.cjs +41 -0
  52. package/lib/cjs/namespaces/services/role-permission.service.cjs +51 -0
  53. package/lib/cjs/namespaces/services/role.service.cjs +45 -0
  54. package/lib/cjs/namespaces/services/storage-binding.service.cjs +39 -0
  55. package/lib/cjs/namespaces/services/system-management.service.cjs +102 -0
  56. package/lib/cjs/namespaces/services/tenant-membership.service.cjs +33 -0
  57. package/lib/cjs/namespaces/services/tenant-profile.service.cjs +28 -0
  58. package/lib/cjs/namespaces/services/tenant.service.cjs +36 -0
  59. package/lib/cjs/namespaces/services/user.service.cjs +32 -0
  60. package/lib/cjs/namespaces/types.cjs +67 -0
  61. package/lib/cjs/namespaces/utils.cjs +161 -0
  62. package/lib/cjs/nest/authService.cjs +5 -2
  63. package/lib/cjs/nest/graph/GraphExecutionController.cjs +153 -0
  64. package/lib/cjs/nest/graph/GraphExecutionModule.cjs +84 -0
  65. package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +82 -0
  66. package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs +66 -0
  67. package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +35 -0
  68. package/lib/cjs/nest/graph/index.cjs +28 -0
  69. package/lib/cjs/nest/index.cjs +3 -2
  70. package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +12 -4
  71. package/lib/esm/graph/nodes/base.js +30 -0
  72. package/lib/esm/graph/nodes/flow-control.js +31 -3
  73. package/lib/esm/graph/nodes/index.js +2 -1
  74. package/lib/esm/graph/types.js +1 -1
  75. package/lib/esm/index.js +5 -4
  76. package/lib/esm/namespaces/index.js +9 -0
  77. package/lib/esm/namespaces/models/authorization-model.js +7 -0
  78. package/lib/esm/namespaces/models/effective-permission.model.js +86 -0
  79. package/lib/esm/namespaces/models/group-membership.model.js +57 -0
  80. package/lib/esm/namespaces/models/group.model.js +65 -0
  81. package/lib/esm/namespaces/models/index.js +22 -0
  82. package/lib/esm/namespaces/models/inheritance-block.model.js +67 -0
  83. package/lib/esm/namespaces/models/org-unit-closure.model.js +57 -0
  84. package/lib/esm/namespaces/models/org-unit-membership.model.js +64 -0
  85. package/lib/esm/namespaces/models/org-unit-profile.model.js +55 -0
  86. package/lib/esm/namespaces/models/org-unit.model.js +93 -0
  87. package/lib/esm/namespaces/models/permission.model.js +55 -0
  88. package/lib/esm/namespaces/models/principal.model.js +68 -0
  89. package/lib/esm/namespaces/models/protected-resource.model.js +90 -0
  90. package/lib/esm/namespaces/models/resource-grant.model.js +79 -0
  91. package/lib/esm/namespaces/models/role-assignment.model.js +89 -0
  92. package/lib/esm/namespaces/models/role-permission.model.js +46 -0
  93. package/lib/esm/namespaces/models/role.model.js +75 -0
  94. package/lib/esm/namespaces/models/storage-binding.model.js +76 -0
  95. package/lib/esm/namespaces/models/tenant-membership.model.js +58 -0
  96. package/lib/esm/namespaces/models/tenant-profile.model.js +55 -0
  97. package/lib/esm/namespaces/models/tenant.model.js +79 -0
  98. package/lib/esm/namespaces/models/user.model.js +66 -0
  99. package/lib/esm/namespaces/org-based-authorization-system.js +283 -0
  100. package/lib/esm/namespaces/org-based-authorization-system.models.js +958 -0
  101. package/lib/esm/namespaces/org-based-authorization-system.services.js +1014 -0
  102. package/lib/esm/namespaces/services/authz.service.js +71 -0
  103. package/lib/esm/namespaces/services/bootstrap.service.js +102 -0
  104. package/lib/esm/namespaces/services/effective-permission.service.js +140 -0
  105. package/lib/esm/namespaces/services/group-membership.service.js +37 -0
  106. package/lib/esm/namespaces/services/group.service.js +25 -0
  107. package/lib/esm/namespaces/services/index.js +25 -0
  108. package/lib/esm/namespaces/services/inheritance-block.service.js +27 -0
  109. package/lib/esm/namespaces/services/org-unit-closure.service.js +50 -0
  110. package/lib/esm/namespaces/services/org-unit-membership.service.js +29 -0
  111. package/lib/esm/namespaces/services/org-unit-profile.service.js +18 -0
  112. package/lib/esm/namespaces/services/org-unit.service.js +150 -0
  113. package/lib/esm/namespaces/services/permission.service.js +24 -0
  114. package/lib/esm/namespaces/services/principal.service.js +30 -0
  115. package/lib/esm/namespaces/services/protected-resource.service.js +38 -0
  116. package/lib/esm/namespaces/services/resource-grant.service.js +40 -0
  117. package/lib/esm/namespaces/services/resource-lifecycle.service.js +19 -0
  118. package/lib/esm/namespaces/services/role-assignment.service.js +36 -0
  119. package/lib/esm/namespaces/services/role-permission.service.js +46 -0
  120. package/lib/esm/namespaces/services/role.service.js +40 -0
  121. package/lib/esm/namespaces/services/storage-binding.service.js +34 -0
  122. package/lib/esm/namespaces/services/system-management.service.js +92 -0
  123. package/lib/esm/namespaces/services/tenant-membership.service.js +28 -0
  124. package/lib/esm/namespaces/services/tenant-profile.service.js +23 -0
  125. package/lib/esm/namespaces/services/tenant.service.js +31 -0
  126. package/lib/esm/namespaces/services/user.service.js +27 -0
  127. package/lib/esm/namespaces/types.js +71 -0
  128. package/lib/esm/namespaces/utils.js +143 -0
  129. package/lib/esm/nest/authService.js +4 -1
  130. package/lib/esm/nest/graph/GraphExecutionController.js +144 -0
  131. package/lib/esm/nest/graph/GraphExecutionModule.js +76 -0
  132. package/lib/esm/nest/graph/GraphExecutionResultModel.js +73 -0
  133. package/lib/esm/nest/graph/GraphExecutionResultRepository.js +60 -0
  134. package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +31 -0
  135. package/lib/esm/nest/graph/index.js +11 -0
  136. package/lib/esm/nest/index.js +2 -1
  137. package/lib/types/graph/nodes/base.d.cts +28 -0
  138. package/lib/types/graph/nodes/base.d.mts +28 -0
  139. package/lib/types/graph/nodes/flow-control.d.cts +9 -1
  140. package/lib/types/graph/nodes/flow-control.d.mts +9 -1
  141. package/lib/types/graph/nodes/index.d.cts +1 -0
  142. package/lib/types/graph/nodes/index.d.mts +1 -0
  143. package/lib/types/graph/types.d.cts +15 -1
  144. package/lib/types/graph/types.d.mts +15 -1
  145. package/lib/types/index.d.cts +3 -2
  146. package/lib/types/index.d.mts +3 -2
  147. package/lib/types/namespaces/index.d.cts +8 -0
  148. package/lib/types/namespaces/index.d.mts +8 -0
  149. package/lib/types/namespaces/models/authorization-model.d.cts +4 -0
  150. package/lib/types/namespaces/models/authorization-model.d.mts +4 -0
  151. package/lib/types/namespaces/models/effective-permission.model.d.cts +18 -0
  152. package/lib/types/namespaces/models/effective-permission.model.d.mts +18 -0
  153. package/lib/types/namespaces/models/group-membership.model.d.cts +13 -0
  154. package/lib/types/namespaces/models/group-membership.model.d.mts +13 -0
  155. package/lib/types/namespaces/models/group.model.d.cts +15 -0
  156. package/lib/types/namespaces/models/group.model.d.mts +15 -0
  157. package/lib/types/namespaces/models/index.d.cts +21 -0
  158. package/lib/types/namespaces/models/index.d.mts +21 -0
  159. package/lib/types/namespaces/models/inheritance-block.model.d.cts +15 -0
  160. package/lib/types/namespaces/models/inheritance-block.model.d.mts +15 -0
  161. package/lib/types/namespaces/models/org-unit-closure.model.d.cts +12 -0
  162. package/lib/types/namespaces/models/org-unit-closure.model.d.mts +12 -0
  163. package/lib/types/namespaces/models/org-unit-membership.model.d.cts +15 -0
  164. package/lib/types/namespaces/models/org-unit-membership.model.d.mts +15 -0
  165. package/lib/types/namespaces/models/org-unit-profile.model.d.cts +11 -0
  166. package/lib/types/namespaces/models/org-unit-profile.model.d.mts +11 -0
  167. package/lib/types/namespaces/models/org-unit.model.d.cts +23 -0
  168. package/lib/types/namespaces/models/org-unit.model.d.mts +23 -0
  169. package/lib/types/namespaces/models/permission.model.d.cts +11 -0
  170. package/lib/types/namespaces/models/permission.model.d.mts +11 -0
  171. package/lib/types/namespaces/models/principal.model.d.cts +16 -0
  172. package/lib/types/namespaces/models/principal.model.d.mts +16 -0
  173. package/lib/types/namespaces/models/protected-resource.model.d.cts +21 -0
  174. package/lib/types/namespaces/models/protected-resource.model.d.mts +21 -0
  175. package/lib/types/namespaces/models/resource-grant.model.d.cts +18 -0
  176. package/lib/types/namespaces/models/resource-grant.model.d.mts +18 -0
  177. package/lib/types/namespaces/models/role-assignment.model.d.cts +20 -0
  178. package/lib/types/namespaces/models/role-assignment.model.d.mts +20 -0
  179. package/lib/types/namespaces/models/role-permission.model.d.cts +10 -0
  180. package/lib/types/namespaces/models/role-permission.model.d.mts +10 -0
  181. package/lib/types/namespaces/models/role.model.d.cts +17 -0
  182. package/lib/types/namespaces/models/role.model.d.mts +17 -0
  183. package/lib/types/namespaces/models/storage-binding.model.d.cts +15 -0
  184. package/lib/types/namespaces/models/storage-binding.model.d.mts +15 -0
  185. package/lib/types/namespaces/models/tenant-membership.model.d.cts +13 -0
  186. package/lib/types/namespaces/models/tenant-membership.model.d.mts +13 -0
  187. package/lib/types/namespaces/models/tenant-profile.model.d.cts +11 -0
  188. package/lib/types/namespaces/models/tenant-profile.model.d.mts +11 -0
  189. package/lib/types/namespaces/models/tenant.model.d.cts +19 -0
  190. package/lib/types/namespaces/models/tenant.model.d.mts +19 -0
  191. package/lib/types/namespaces/models/user.model.d.cts +14 -0
  192. package/lib/types/namespaces/models/user.model.d.mts +14 -0
  193. package/lib/types/namespaces/org-based-authorization-system.d.cts +299 -0
  194. package/lib/types/namespaces/org-based-authorization-system.d.mts +299 -0
  195. package/lib/types/namespaces/org-based-authorization-system.models.d.cts +212 -0
  196. package/lib/types/namespaces/org-based-authorization-system.models.d.mts +212 -0
  197. package/lib/types/namespaces/org-based-authorization-system.services.d.cts +217 -0
  198. package/lib/types/namespaces/org-based-authorization-system.services.d.mts +217 -0
  199. package/lib/types/namespaces/services/authz.service.d.cts +10 -0
  200. package/lib/types/namespaces/services/authz.service.d.mts +10 -0
  201. package/lib/types/namespaces/services/bootstrap.service.d.cts +21 -0
  202. package/lib/types/namespaces/services/bootstrap.service.d.mts +21 -0
  203. package/lib/types/namespaces/services/effective-permission.service.d.cts +13 -0
  204. package/lib/types/namespaces/services/effective-permission.service.d.mts +13 -0
  205. package/lib/types/namespaces/services/group-membership.service.d.cts +10 -0
  206. package/lib/types/namespaces/services/group-membership.service.d.mts +10 -0
  207. package/lib/types/namespaces/services/group.service.d.cts +9 -0
  208. package/lib/types/namespaces/services/group.service.d.mts +9 -0
  209. package/lib/types/namespaces/services/index.d.cts +24 -0
  210. package/lib/types/namespaces/services/index.d.mts +24 -0
  211. package/lib/types/namespaces/services/inheritance-block.service.d.cts +10 -0
  212. package/lib/types/namespaces/services/inheritance-block.service.d.mts +10 -0
  213. package/lib/types/namespaces/services/org-unit-closure.service.d.cts +11 -0
  214. package/lib/types/namespaces/services/org-unit-closure.service.d.mts +11 -0
  215. package/lib/types/namespaces/services/org-unit-membership.service.d.cts +11 -0
  216. package/lib/types/namespaces/services/org-unit-membership.service.d.mts +11 -0
  217. package/lib/types/namespaces/services/org-unit-profile.service.d.cts +7 -0
  218. package/lib/types/namespaces/services/org-unit-profile.service.d.mts +7 -0
  219. package/lib/types/namespaces/services/org-unit.service.d.cts +18 -0
  220. package/lib/types/namespaces/services/org-unit.service.d.mts +18 -0
  221. package/lib/types/namespaces/services/permission.service.d.cts +10 -0
  222. package/lib/types/namespaces/services/permission.service.d.mts +10 -0
  223. package/lib/types/namespaces/services/principal.service.d.cts +11 -0
  224. package/lib/types/namespaces/services/principal.service.d.mts +11 -0
  225. package/lib/types/namespaces/services/protected-resource.service.d.cts +13 -0
  226. package/lib/types/namespaces/services/protected-resource.service.d.mts +13 -0
  227. package/lib/types/namespaces/services/resource-grant.service.d.cts +12 -0
  228. package/lib/types/namespaces/services/resource-grant.service.d.mts +12 -0
  229. package/lib/types/namespaces/services/resource-lifecycle.service.d.cts +10 -0
  230. package/lib/types/namespaces/services/resource-lifecycle.service.d.mts +10 -0
  231. package/lib/types/namespaces/services/role-assignment.service.d.cts +12 -0
  232. package/lib/types/namespaces/services/role-assignment.service.d.mts +12 -0
  233. package/lib/types/namespaces/services/role-permission.service.d.cts +12 -0
  234. package/lib/types/namespaces/services/role-permission.service.d.mts +12 -0
  235. package/lib/types/namespaces/services/role.service.d.cts +12 -0
  236. package/lib/types/namespaces/services/role.service.d.mts +12 -0
  237. package/lib/types/namespaces/services/storage-binding.service.d.cts +12 -0
  238. package/lib/types/namespaces/services/storage-binding.service.d.mts +12 -0
  239. package/lib/types/namespaces/services/system-management.service.d.cts +14 -0
  240. package/lib/types/namespaces/services/system-management.service.d.mts +14 -0
  241. package/lib/types/namespaces/services/tenant-membership.service.d.cts +11 -0
  242. package/lib/types/namespaces/services/tenant-membership.service.d.mts +11 -0
  243. package/lib/types/namespaces/services/tenant-profile.service.d.cts +8 -0
  244. package/lib/types/namespaces/services/tenant-profile.service.d.mts +8 -0
  245. package/lib/types/namespaces/services/tenant.service.d.cts +12 -0
  246. package/lib/types/namespaces/services/tenant.service.d.mts +12 -0
  247. package/lib/types/namespaces/services/user.service.d.cts +11 -0
  248. package/lib/types/namespaces/services/user.service.d.mts +11 -0
  249. package/lib/types/namespaces/types.d.cts +230 -0
  250. package/lib/types/namespaces/types.d.mts +230 -0
  251. package/lib/types/namespaces/utils.d.cts +68 -0
  252. package/lib/types/namespaces/utils.d.mts +68 -0
  253. package/lib/types/nest/authService.d.cts +1 -0
  254. package/lib/types/nest/authService.d.mts +1 -0
  255. package/lib/types/nest/graph/GraphExecutionController.d.cts +62 -0
  256. package/lib/types/nest/graph/GraphExecutionController.d.mts +62 -0
  257. package/lib/types/nest/graph/GraphExecutionModule.d.cts +39 -0
  258. package/lib/types/nest/graph/GraphExecutionModule.d.mts +39 -0
  259. package/lib/types/nest/graph/GraphExecutionResultModel.d.cts +46 -0
  260. package/lib/types/nest/graph/GraphExecutionResultModel.d.mts +46 -0
  261. package/lib/types/nest/graph/GraphExecutionResultRepository.d.cts +38 -0
  262. package/lib/types/nest/graph/GraphExecutionResultRepository.d.mts +38 -0
  263. package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.cts +17 -0
  264. package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.mts +17 -0
  265. package/lib/types/nest/graph/index.d.cts +10 -0
  266. package/lib/types/nest/graph/index.d.mts +10 -0
  267. package/lib/types/nest/index.d.cts +1 -0
  268. package/lib/types/nest/index.d.mts +1 -0
  269. package/package.json +16 -5
  270. package/sql/001_constraints.sql +11 -0
  271. package/sql/002_rls.sql +20 -0
  272. package/sql/003_indexes.sql +2 -0
@@ -33,6 +33,7 @@ export declare class AuthService {
33
33
  private readonly excludedClients;
34
34
  private jwks;
35
35
  constructor(options?: AuthServiceOptions);
36
+ isTokenVerificationEnabled(): boolean;
36
37
  getTokenPayload(jwt: string): KeycloakAccessTokenPayload | null;
37
38
  getRoles(jwt: string): string[];
38
39
  getUser(jwt: string): KeycloakUser | undefined;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionController
3
+ * @summary NestJS controller bridging the graph execution engine to REST + SSE.
4
+ * @description Exposes three endpoints:
5
+ * - `POST /graph/execute` — triggers {@link GraphExecutionEngine.execute}, persists the result via a Decaf repository, and returns `{ runId, status, outputs }`.
6
+ * - `GET /graph/events` — SSE endpoint streaming {@link GraphExecutionEvent}s as `[modelName, operation, id, payload]` tuples (compatible with for-http's `ServerEventConnector`).
7
+ * - `GET /graph/results/:runId` — retrieves a persisted {@link GraphExecutionResultModel} from the repository.
8
+ *
9
+ * This is the production pattern: for-nest hosts the engine, for-angular consumes events over the network via SSE and fetches persisted results via REST.
10
+ */
11
+ import { MessageEvent } from "@nestjs/common";
12
+ import { Observable } from "rxjs";
13
+ import { GraphExecutionEngine, type GraphExecutionValues } from "../../graph/index.d.cts";
14
+ import type { GraphWorkflowDefinition } from "@decaf-ts/ui-decorators/graph";
15
+ import { type GraphExecutionResultRepositoryInstance } from "./GraphExecutionResultRepository.d.cts";
16
+ /**
17
+ * NestJS injection token for the graph execution result repository.
18
+ */
19
+ export declare const GRAPH_RESULT_REPOSITORY = "GRAPH_RESULT_REPOSITORY";
20
+ /**
21
+ * Payload for the `POST /graph/execute` endpoint.
22
+ */
23
+ export interface GraphExecutePayload {
24
+ workflow: GraphWorkflowDefinition;
25
+ inputs: GraphExecutionValues;
26
+ }
27
+ /**
28
+ * Response shape for the `POST /graph/execute` endpoint.
29
+ */
30
+ export interface GraphExecuteResponse {
31
+ runId: string;
32
+ status: string;
33
+ outputs: Record<string, unknown>;
34
+ }
35
+ /**
36
+ * NestJS controller that hosts the graph execution engine server-side,
37
+ * streams events via SSE, and persists results for later retrieval.
38
+ */
39
+ export declare class GraphExecutionController {
40
+ private readonly engine;
41
+ private readonly resultRepository;
42
+ private readonly eventSubject;
43
+ constructor(engine: GraphExecutionEngine, resultRepository: GraphExecutionResultRepositoryInstance);
44
+ /**
45
+ * Triggers graph execution server-side, persists the result, and returns
46
+ * a summary containing the `runId`, `status`, and `outputs`.
47
+ */
48
+ execute(body: GraphExecutePayload): Promise<GraphExecuteResponse>;
49
+ /**
50
+ * SSE endpoint that streams graph execution events.
51
+ *
52
+ * Events are serialized as `[modelName, operation, id, payload]` to match
53
+ * the format expected by for-http's `ServerEventConnector`.
54
+ */
55
+ events(): Observable<MessageEvent>;
56
+ /**
57
+ * Retrieves a persisted graph execution result by its `runId`.
58
+ *
59
+ * @throws {NotFoundException} when no result is stored for the given `runId`.
60
+ */
61
+ getResult(runId: string): Promise<unknown>;
62
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionController
3
+ * @summary NestJS controller bridging the graph execution engine to REST + SSE.
4
+ * @description Exposes three endpoints:
5
+ * - `POST /graph/execute` — triggers {@link GraphExecutionEngine.execute}, persists the result via a Decaf repository, and returns `{ runId, status, outputs }`.
6
+ * - `GET /graph/events` — SSE endpoint streaming {@link GraphExecutionEvent}s as `[modelName, operation, id, payload]` tuples (compatible with for-http's `ServerEventConnector`).
7
+ * - `GET /graph/results/:runId` — retrieves a persisted {@link GraphExecutionResultModel} from the repository.
8
+ *
9
+ * This is the production pattern: for-nest hosts the engine, for-angular consumes events over the network via SSE and fetches persisted results via REST.
10
+ */
11
+ import { MessageEvent } from "@nestjs/common";
12
+ import { Observable } from "rxjs";
13
+ import { GraphExecutionEngine, type GraphExecutionValues } from "../../graph/index.d.mts";
14
+ import type { GraphWorkflowDefinition } from "@decaf-ts/ui-decorators/graph";
15
+ import { type GraphExecutionResultRepositoryInstance } from "./GraphExecutionResultRepository.d.mts";
16
+ /**
17
+ * NestJS injection token for the graph execution result repository.
18
+ */
19
+ export declare const GRAPH_RESULT_REPOSITORY = "GRAPH_RESULT_REPOSITORY";
20
+ /**
21
+ * Payload for the `POST /graph/execute` endpoint.
22
+ */
23
+ export interface GraphExecutePayload {
24
+ workflow: GraphWorkflowDefinition;
25
+ inputs: GraphExecutionValues;
26
+ }
27
+ /**
28
+ * Response shape for the `POST /graph/execute` endpoint.
29
+ */
30
+ export interface GraphExecuteResponse {
31
+ runId: string;
32
+ status: string;
33
+ outputs: Record<string, unknown>;
34
+ }
35
+ /**
36
+ * NestJS controller that hosts the graph execution engine server-side,
37
+ * streams events via SSE, and persists results for later retrieval.
38
+ */
39
+ export declare class GraphExecutionController {
40
+ private readonly engine;
41
+ private readonly resultRepository;
42
+ private readonly eventSubject;
43
+ constructor(engine: GraphExecutionEngine, resultRepository: GraphExecutionResultRepositoryInstance);
44
+ /**
45
+ * Triggers graph execution server-side, persists the result, and returns
46
+ * a summary containing the `runId`, `status`, and `outputs`.
47
+ */
48
+ execute(body: GraphExecutePayload): Promise<GraphExecuteResponse>;
49
+ /**
50
+ * SSE endpoint that streams graph execution events.
51
+ *
52
+ * Events are serialized as `[modelName, operation, id, payload]` to match
53
+ * the format expected by for-http's `ServerEventConnector`.
54
+ */
55
+ events(): Observable<MessageEvent>;
56
+ /**
57
+ * Retrieves a persisted graph execution result by its `runId`.
58
+ *
59
+ * @throws {NotFoundException} when no result is stored for the given `runId`.
60
+ */
61
+ getResult(runId: string): Promise<unknown>;
62
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionModule
3
+ * @summary NestJS DynamicModule hosting the graph execution engine.
4
+ * @description Wires the {@link GraphExecutionEngine}, a demo executor registry, a RamAdapter-backed result repository, and the {@link GraphExecutionController} into a single NestJS module. Use `GraphExecutionModule.forRoot()` to register it in the application.
5
+ */
6
+ import { DynamicModule } from "@nestjs/common";
7
+ /**
8
+ * Options for {@link GraphExecutionModule.forRoot}.
9
+ */
10
+ export interface GraphExecutionModuleOptions {
11
+ /**
12
+ * User identifier passed to the RamAdapter. Defaults to `"graph-engine"`.
13
+ */
14
+ adapterUser?: string;
15
+ /**
16
+ * When `true`, calls `RamAdapter.decoration()` and
17
+ * `Adapter.setCurrent(RamFlavour)` during module initialisation. Defaults to
18
+ * `true`. Set to `false` when the host application has already configured a
19
+ * RamAdapter.
20
+ */
21
+ initAdapter?: boolean;
22
+ }
23
+ /**
24
+ * NestJS module that hosts the graph execution engine server-side.
25
+ *
26
+ * Provides:
27
+ * - {@link GraphExecutionEngine} — singleton engine with a demo executor registry.
28
+ * - `GRAPH_RESULT_REPOSITORY` — Decaf repository for {@link GraphExecutionResultModel} backed by RamAdapter.
29
+ * - {@link GraphExecutionController} — REST + SSE controller.
30
+ */
31
+ export declare class GraphExecutionModule {
32
+ /**
33
+ * Creates a configured {@link DynamicModule} for the graph execution backend.
34
+ *
35
+ * @param options - Module configuration options.
36
+ * @returns A NestJS `DynamicModule` ready for import.
37
+ */
38
+ static forRoot(options?: GraphExecutionModuleOptions): DynamicModule;
39
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionModule
3
+ * @summary NestJS DynamicModule hosting the graph execution engine.
4
+ * @description Wires the {@link GraphExecutionEngine}, a demo executor registry, a RamAdapter-backed result repository, and the {@link GraphExecutionController} into a single NestJS module. Use `GraphExecutionModule.forRoot()` to register it in the application.
5
+ */
6
+ import { DynamicModule } from "@nestjs/common";
7
+ /**
8
+ * Options for {@link GraphExecutionModule.forRoot}.
9
+ */
10
+ export interface GraphExecutionModuleOptions {
11
+ /**
12
+ * User identifier passed to the RamAdapter. Defaults to `"graph-engine"`.
13
+ */
14
+ adapterUser?: string;
15
+ /**
16
+ * When `true`, calls `RamAdapter.decoration()` and
17
+ * `Adapter.setCurrent(RamFlavour)` during module initialisation. Defaults to
18
+ * `true`. Set to `false` when the host application has already configured a
19
+ * RamAdapter.
20
+ */
21
+ initAdapter?: boolean;
22
+ }
23
+ /**
24
+ * NestJS module that hosts the graph execution engine server-side.
25
+ *
26
+ * Provides:
27
+ * - {@link GraphExecutionEngine} — singleton engine with a demo executor registry.
28
+ * - `GRAPH_RESULT_REPOSITORY` — Decaf repository for {@link GraphExecutionResultModel} backed by RamAdapter.
29
+ * - {@link GraphExecutionController} — REST + SSE controller.
30
+ */
31
+ export declare class GraphExecutionModule {
32
+ /**
33
+ * Creates a configured {@link DynamicModule} for the graph execution backend.
34
+ *
35
+ * @param options - Module configuration options.
36
+ * @returns A NestJS `DynamicModule` ready for import.
37
+ */
38
+ static forRoot(options?: GraphExecutionModuleOptions): DynamicModule;
39
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionResultModel
3
+ * @summary Decaf model for persisting graph execution results.
4
+ * @description Serializes a {@link GraphExecutionResult} for storage in a Decaf persistence adapter (e.g. RamAdapter). Stores the run id, workflow id, status, inputs, outputs, per-node results, and timing information so clients can retrieve a completed run's full state via `GET /graph/results/:runId`.
5
+ */
6
+ import { Model, type ModelArg } from "@decaf-ts/decorator-validation";
7
+ /**
8
+ * Persisted representation of a completed graph execution run.
9
+ *
10
+ * Stored in the `graph_execution_result` table and keyed by `runId`.
11
+ */
12
+ export declare class GraphExecutionResultModel extends Model {
13
+ /**
14
+ * Unique identifier for this execution run. Acts as the primary key.
15
+ */
16
+ runId: string;
17
+ /**
18
+ * Identifier of the workflow that was executed.
19
+ */
20
+ workflowId: string;
21
+ /**
22
+ * Final status of the run (e.g. `succeeded`, `failed`).
23
+ */
24
+ status: string;
25
+ /**
26
+ * Inputs supplied to the workflow at execution time.
27
+ */
28
+ inputs: Record<string, unknown>;
29
+ /**
30
+ * Outputs produced by the workflow.
31
+ */
32
+ outputs: Record<string, unknown>;
33
+ /**
34
+ * Per-node execution results keyed by node id.
35
+ */
36
+ nodeResults: Record<string, unknown>;
37
+ /**
38
+ * Timestamp marking when the run started.
39
+ */
40
+ startedAt: Date;
41
+ /**
42
+ * Timestamp marking when the run finished.
43
+ */
44
+ finishedAt?: Date;
45
+ constructor(arg?: ModelArg<GraphExecutionResultModel>);
46
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionResultModel
3
+ * @summary Decaf model for persisting graph execution results.
4
+ * @description Serializes a {@link GraphExecutionResult} for storage in a Decaf persistence adapter (e.g. RamAdapter). Stores the run id, workflow id, status, inputs, outputs, per-node results, and timing information so clients can retrieve a completed run's full state via `GET /graph/results/:runId`.
5
+ */
6
+ import { Model, type ModelArg } from "@decaf-ts/decorator-validation";
7
+ /**
8
+ * Persisted representation of a completed graph execution run.
9
+ *
10
+ * Stored in the `graph_execution_result` table and keyed by `runId`.
11
+ */
12
+ export declare class GraphExecutionResultModel extends Model {
13
+ /**
14
+ * Unique identifier for this execution run. Acts as the primary key.
15
+ */
16
+ runId: string;
17
+ /**
18
+ * Identifier of the workflow that was executed.
19
+ */
20
+ workflowId: string;
21
+ /**
22
+ * Final status of the run (e.g. `succeeded`, `failed`).
23
+ */
24
+ status: string;
25
+ /**
26
+ * Inputs supplied to the workflow at execution time.
27
+ */
28
+ inputs: Record<string, unknown>;
29
+ /**
30
+ * Outputs produced by the workflow.
31
+ */
32
+ outputs: Record<string, unknown>;
33
+ /**
34
+ * Per-node execution results keyed by node id.
35
+ */
36
+ nodeResults: Record<string, unknown>;
37
+ /**
38
+ * Timestamp marking when the run started.
39
+ */
40
+ startedAt: Date;
41
+ /**
42
+ * Timestamp marking when the run finished.
43
+ */
44
+ finishedAt?: Date;
45
+ constructor(arg?: ModelArg<GraphExecutionResultModel>);
46
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionResultRepository
3
+ * @summary Repository for persisting and retrieving graph execution results.
4
+ * @description Provides a typed handle to a Decaf {@link Repository} backed by RamAdapter, with convenience methods for saving and loading {@link GraphExecutionResultModel} records. The repository is created via `Repository.forModel()` so it inherits all standard Decaf CRUD operations.
5
+ */
6
+ import { Repository } from "@decaf-ts/core";
7
+ import type { GraphExecutionResult } from "../../graph/index.d.cts";
8
+ import { GraphExecutionResultModel } from "./GraphExecutionResultModel.d.cts";
9
+ /**
10
+ * Type alias for the Decaf repository typed to {@link GraphExecutionResultModel}.
11
+ */
12
+ export type GraphExecutionResultRepositoryInstance = Repository<GraphExecutionResultModel, any>;
13
+ /**
14
+ * Creates a Decaf repository for {@link GraphExecutionResultModel}.
15
+ *
16
+ * The caller must ensure the RamAdapter has been initialised and set as the
17
+ * current adapter (via `RamAdapter.decoration()` and `Adapter.setCurrent()`)
18
+ * before invoking this factory.
19
+ *
20
+ * @returns A Decaf repository instance for {@link GraphExecutionResultModel}.
21
+ */
22
+ export declare function createGraphExecutionResultRepository(): import("@decaf-ts/core").Repo<GraphExecutionResultModel>;
23
+ /**
24
+ * Converts a {@link GraphExecutionResult} into a persistable
25
+ * {@link GraphExecutionResultModel}.
26
+ *
27
+ * @param result - The execution result to convert.
28
+ * @returns A model instance ready for persistence.
29
+ */
30
+ export declare function toResultModel(result: GraphExecutionResult): GraphExecutionResultModel;
31
+ /**
32
+ * Converts a persisted {@link GraphExecutionResultModel} back into a plain
33
+ * result-like object suitable for API responses.
34
+ *
35
+ * @param model - The persisted model (or `null` if not found).
36
+ * @returns A plain object with the result fields, or `null`.
37
+ */
38
+ export declare function fromResultModel(model: GraphExecutionResultModel | null): Omit<GraphExecutionResult, "workflow" | "events" | "metadata"> | null;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutionResultRepository
3
+ * @summary Repository for persisting and retrieving graph execution results.
4
+ * @description Provides a typed handle to a Decaf {@link Repository} backed by RamAdapter, with convenience methods for saving and loading {@link GraphExecutionResultModel} records. The repository is created via `Repository.forModel()` so it inherits all standard Decaf CRUD operations.
5
+ */
6
+ import { Repository } from "@decaf-ts/core";
7
+ import type { GraphExecutionResult } from "../../graph/index.d.mts";
8
+ import { GraphExecutionResultModel } from "./GraphExecutionResultModel.d.mts";
9
+ /**
10
+ * Type alias for the Decaf repository typed to {@link GraphExecutionResultModel}.
11
+ */
12
+ export type GraphExecutionResultRepositoryInstance = Repository<GraphExecutionResultModel, any>;
13
+ /**
14
+ * Creates a Decaf repository for {@link GraphExecutionResultModel}.
15
+ *
16
+ * The caller must ensure the RamAdapter has been initialised and set as the
17
+ * current adapter (via `RamAdapter.decoration()` and `Adapter.setCurrent()`)
18
+ * before invoking this factory.
19
+ *
20
+ * @returns A Decaf repository instance for {@link GraphExecutionResultModel}.
21
+ */
22
+ export declare function createGraphExecutionResultRepository(): import("@decaf-ts/core").Repo<GraphExecutionResultModel>;
23
+ /**
24
+ * Converts a {@link GraphExecutionResult} into a persistable
25
+ * {@link GraphExecutionResultModel}.
26
+ *
27
+ * @param result - The execution result to convert.
28
+ * @returns A model instance ready for persistence.
29
+ */
30
+ export declare function toResultModel(result: GraphExecutionResult): GraphExecutionResultModel;
31
+ /**
32
+ * Converts a persisted {@link GraphExecutionResultModel} back into a plain
33
+ * result-like object suitable for API responses.
34
+ *
35
+ * @param model - The persisted model (or `null` if not found).
36
+ * @returns A plain object with the result fields, or `null`.
37
+ */
38
+ export declare function fromResultModel(model: GraphExecutionResultModel | null): Omit<GraphExecutionResult, "workflow" | "events" | "metadata"> | null;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutorRegistryFactory
3
+ * @summary Factory that builds a populated {@link GraphNodeExecutorRegistry}.
4
+ * @description Creates a registry pre-loaded with the demo executors (`math.add`, `math.multiply`) used by the graph execution backend's sample workflows. Additional executors can be registered on the returned registry before it is handed to the {@link GraphExecutionEngine}.
5
+ */
6
+ import { GraphNodeExecutorRegistry } from "../../graph/index.d.cts";
7
+ import type { GraphNodeExecutor } from "../../graph/index.d.cts";
8
+ /**
9
+ * Builds a {@link GraphNodeExecutorRegistry} populated with the demo executors.
10
+ *
11
+ * Registered kinds:
12
+ * - `math.add` — sums `a` and `b` into `sum`.
13
+ * - `math.multiply` — multiplies `x` by 2 into `product`.
14
+ *
15
+ * @returns A populated registry ready for use with {@link GraphExecutionEngine}.
16
+ */
17
+ export declare function createGraphExecutorRegistry(extra?: Record<string, GraphNodeExecutor>): GraphNodeExecutorRegistry;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module integrations/nest/graph/GraphExecutorRegistryFactory
3
+ * @summary Factory that builds a populated {@link GraphNodeExecutorRegistry}.
4
+ * @description Creates a registry pre-loaded with the demo executors (`math.add`, `math.multiply`) used by the graph execution backend's sample workflows. Additional executors can be registered on the returned registry before it is handed to the {@link GraphExecutionEngine}.
5
+ */
6
+ import { GraphNodeExecutorRegistry } from "../../graph/index.d.mts";
7
+ import type { GraphNodeExecutor } from "../../graph/index.d.mts";
8
+ /**
9
+ * Builds a {@link GraphNodeExecutorRegistry} populated with the demo executors.
10
+ *
11
+ * Registered kinds:
12
+ * - `math.add` — sums `a` and `b` into `sum`.
13
+ * - `math.multiply` — multiplies `x` by 2 into `product`.
14
+ *
15
+ * @returns A populated registry ready for use with {@link GraphExecutionEngine}.
16
+ */
17
+ export declare function createGraphExecutorRegistry(extra?: Record<string, GraphNodeExecutor>): GraphNodeExecutorRegistry;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @module integrations/nest/graph
3
+ * @summary NestJS graph execution backend module.
4
+ * @description Server-side hosting for the Decaf graph execution engine. Exposes REST endpoints for triggering execution and retrieving persisted results, plus an SSE endpoint for streaming execution events. Designed to be consumed by for-angular via for-http's `ServerEventConnector`.
5
+ */
6
+ export * from "./GraphExecutionResultModel.d.cts";
7
+ export * from "./GraphExecutionResultRepository.d.cts";
8
+ export * from "./GraphExecutorRegistryFactory.d.cts";
9
+ export * from "./GraphExecutionController.d.cts";
10
+ export * from "./GraphExecutionModule.d.cts";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @module integrations/nest/graph
3
+ * @summary NestJS graph execution backend module.
4
+ * @description Server-side hosting for the Decaf graph execution engine. Exposes REST endpoints for triggering execution and retrieving persisted results, plus an SSE endpoint for streaming execution events. Designed to be consumed by for-angular via for-http's `ServerEventConnector`.
5
+ */
6
+ export * from "./GraphExecutionResultModel.d.mts";
7
+ export * from "./GraphExecutionResultRepository.d.mts";
8
+ export * from "./GraphExecutorRegistryFactory.d.mts";
9
+ export * from "./GraphExecutionController.d.mts";
10
+ export * from "./GraphExecutionModule.d.mts";
@@ -3,6 +3,7 @@ export * from "./utils.d.cts";
3
3
  export * from "./authService.d.cts";
4
4
  export * from "./keycloakAuthHandler.d.cts";
5
5
  export * from "./keycloakModule.d.cts";
6
+ export * from "./graph/index.d.cts";
6
7
  import "./logging";
7
8
  /**
8
9
  * @summary Nest-style auth integrations.
@@ -3,6 +3,7 @@ export * from "./utils.d.mts";
3
3
  export * from "./authService.d.mts";
4
4
  export * from "./keycloakAuthHandler.d.mts";
5
5
  export * from "./keycloakModule.d.mts";
6
+ export * from "./graph/index.d.mts";
6
7
  import "./logging";
7
8
  /**
8
9
  * @summary Nest-style auth integrations.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/integrations",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.mts",
@@ -60,6 +60,17 @@
60
60
  },
61
61
  "default": "./lib/esm/nest/index.js"
62
62
  },
63
+ "./namespaces": {
64
+ "import": {
65
+ "types": "./lib/types/namespaces/index.d.mts",
66
+ "default": "./lib/esm/namespaces/index.js"
67
+ },
68
+ "require": {
69
+ "types": "./lib/types/namespaces/index.d.cts",
70
+ "default": "./lib/cjs/namespaces/index.cjs"
71
+ },
72
+ "default": "./lib/esm/namespaces/index.js"
73
+ },
63
74
  "./secrets": {
64
75
  "import": {
65
76
  "types": "./lib/types/secrets/index.d.mts",
@@ -266,11 +277,11 @@
266
277
  "uuid": "^11.1.1"
267
278
  },
268
279
  "devDependencies": {
280
+ "@decaf-ts/as-zod": "latest",
269
281
  "@decaf-ts/cli": "latest",
270
282
  "@decaf-ts/for-http": "latest",
271
283
  "@decaf-ts/for-nano": "latest",
272
- "@decaf-ts/as-zod": "latest",
273
- "@decaf-ts/for-nest": "0.11.2-refactor.7",
284
+ "@decaf-ts/for-nest": "^0.11.2-refactor.8",
274
285
  "@decaf-ts/utils": "latest",
275
286
  "@nestjs/common": "^11.0.0",
276
287
  "@nestjs/core": "^11.0.0",
@@ -284,9 +295,9 @@
284
295
  "supertest": "^7.0.0"
285
296
  },
286
297
  "peerDependencies": {
287
- "@decaf-ts/for-http": "latest",
288
298
  "@decaf-ts/as-zod": "latest",
289
- "@decaf-ts/for-nest": "0.11.2-refactor.7",
299
+ "@decaf-ts/for-http": "latest",
300
+ "@decaf-ts/for-nest": "^0.11.2-refactor.8",
290
301
  "jose": ">=5.0.0"
291
302
  },
292
303
  "peerDependenciesMeta": {
@@ -0,0 +1,11 @@
1
+ CREATE UNIQUE INDEX uq_tenant_memberships_tenant_user ON tenant_memberships (tenant_id, user_id);
2
+ CREATE UNIQUE INDEX uq_org_unit_memberships_org_user ON org_unit_memberships (tenant_id, org_unit_id, user_id);
3
+ CREATE UNIQUE INDEX uq_principals_tenant_kind_subject ON principals (tenant_id, kind, subject_id);
4
+ CREATE UNIQUE INDEX uq_groups_tenant_org_name ON groups (tenant_id, org_unit_id, lower(name));
5
+ CREATE UNIQUE INDEX uq_roles_tenant_key ON roles (coalesce(tenant_id, '00000000-0000-0000-0000-000000000000'), key);
6
+ CREATE UNIQUE INDEX uq_role_permissions_role_permission ON role_permissions (role_id, permission_id);
7
+ CREATE UNIQUE INDEX uq_role_assignments_identity ON role_assignments (tenant_id, principal_id, role_id, scope_kind, scope_id);
8
+ CREATE UNIQUE INDEX uq_org_closure_pair ON org_unit_closure (tenant_id, ancestor_org_unit_id, descendant_org_unit_id);
9
+ CREATE UNIQUE INDEX uq_resource_domain ON protected_resources (tenant_id, resource_type, resource_id);
10
+ CREATE UNIQUE INDEX uq_resource_grant ON resource_grants (tenant_id, resource_id, principal_id, permission_key);
11
+ CREATE UNIQUE INDEX uq_storage_binding ON storage_bindings (tenant_id, storage_kind);
@@ -0,0 +1,20 @@
1
+ ALTER TABLE protected_resources ENABLE ROW LEVEL SECURITY;
2
+ ALTER TABLE protected_resources FORCE ROW LEVEL SECURITY;
3
+
4
+ CREATE POLICY protected_resources_select_policy
5
+ ON protected_resources
6
+ FOR SELECT
7
+ USING (
8
+ EXISTS (
9
+ SELECT 1
10
+ FROM effective_permissions ep
11
+ WHERE ep.tenant_id = protected_resources.tenant_id
12
+ AND ep.principal_id = current_setting('app.principal_id')::uuid
13
+ AND ep.permission_key = 'resource.read'
14
+ AND (
15
+ (ep.scope_kind = 'tenant' AND ep.scope_id = protected_resources.tenant_id)
16
+ OR (ep.scope_kind = 'org_unit' AND ep.scope_id = protected_resources.org_unit_id)
17
+ OR (ep.scope_kind = 'resource' AND ep.scope_id = protected_resources.id)
18
+ )
19
+ )
20
+ );
@@ -0,0 +1,2 @@
1
+ -- Add partial, JSONB, and graph-specific indexes in migrations.
2
+ -- The exact columns depend on the generated TypeORM column names in the runtime schema.