@powerhousedao/reactor-api 6.0.0-dev.8 → 6.0.0-dev.80

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 (267) hide show
  1. package/dist/codegen.js +1 -1
  2. package/dist/codegen.js.map +1 -1
  3. package/dist/index.d.ts +4 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +4 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/src/config.d.ts +1 -2
  8. package/dist/src/config.d.ts.map +1 -1
  9. package/dist/src/config.js +1 -5
  10. package/dist/src/config.js.map +1 -1
  11. package/dist/src/graphql/auth/resolvers.d.ts +17 -0
  12. package/dist/src/graphql/auth/resolvers.d.ts.map +1 -1
  13. package/dist/src/graphql/auth/resolvers.js +54 -0
  14. package/dist/src/graphql/auth/resolvers.js.map +1 -1
  15. package/dist/src/graphql/auth/schema.graphql +27 -5
  16. package/dist/src/graphql/auth/subgraph.d.ts +25 -0
  17. package/dist/src/graphql/auth/subgraph.d.ts.map +1 -1
  18. package/dist/src/graphql/auth/subgraph.js +45 -1
  19. package/dist/src/graphql/auth/subgraph.js.map +1 -1
  20. package/dist/src/graphql/base-subgraph.d.ts +12 -4
  21. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  22. package/dist/src/graphql/base-subgraph.js +94 -2
  23. package/dist/src/graphql/base-subgraph.js.map +1 -1
  24. package/dist/src/graphql/document-model-subgraph.d.ts +16 -44
  25. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
  26. package/dist/src/graphql/document-model-subgraph.js +285 -87
  27. package/dist/src/graphql/document-model-subgraph.js.map +1 -1
  28. package/dist/src/graphql/graphql-manager.d.ts +28 -6
  29. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  30. package/dist/src/graphql/graphql-manager.js +266 -161
  31. package/dist/src/graphql/graphql-manager.js.map +1 -1
  32. package/dist/src/graphql/index.d.ts +2 -1
  33. package/dist/src/graphql/index.d.ts.map +1 -1
  34. package/dist/src/graphql/index.js +2 -1
  35. package/dist/src/graphql/index.js.map +1 -1
  36. package/dist/src/graphql/packages/index.d.ts +2 -0
  37. package/dist/src/graphql/packages/index.d.ts.map +1 -0
  38. package/dist/src/graphql/packages/index.js +2 -0
  39. package/dist/src/graphql/packages/index.js.map +1 -0
  40. package/dist/src/graphql/packages/resolvers.d.ts +31 -0
  41. package/dist/src/graphql/packages/resolvers.d.ts.map +1 -0
  42. package/dist/src/graphql/packages/resolvers.js +37 -0
  43. package/dist/src/graphql/packages/resolvers.js.map +1 -0
  44. package/dist/src/graphql/packages/schema.graphql +50 -0
  45. package/dist/src/graphql/packages/subgraph.d.ts +55 -0
  46. package/dist/src/graphql/packages/subgraph.d.ts.map +1 -0
  47. package/dist/src/graphql/packages/subgraph.js +73 -0
  48. package/dist/src/graphql/packages/subgraph.js.map +1 -0
  49. package/dist/src/graphql/reactor/adapters.d.ts +10 -2
  50. package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
  51. package/dist/src/graphql/reactor/adapters.js +35 -1
  52. package/dist/src/graphql/reactor/adapters.js.map +1 -1
  53. package/dist/src/graphql/reactor/factory.d.ts +16 -1
  54. package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
  55. package/dist/src/graphql/reactor/factory.js +1 -1
  56. package/dist/src/graphql/reactor/factory.js.map +1 -1
  57. package/dist/src/graphql/reactor/gen/graphql.d.ts +271 -76
  58. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
  59. package/dist/src/graphql/reactor/gen/graphql.js +181 -10
  60. package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
  61. package/dist/src/graphql/reactor/index.d.ts +1 -1
  62. package/dist/src/graphql/reactor/index.d.ts.map +1 -1
  63. package/dist/src/graphql/reactor/index.js +1 -1
  64. package/dist/src/graphql/reactor/index.js.map +1 -1
  65. package/dist/src/graphql/reactor/operations.graphql +132 -1
  66. package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
  67. package/dist/src/graphql/reactor/requester.with-zod.js +109 -38
  68. package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
  69. package/dist/src/graphql/reactor/resolvers.d.ts +78 -25
  70. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  71. package/dist/src/graphql/reactor/resolvers.js +197 -74
  72. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  73. package/dist/src/graphql/reactor/schema.graphql +70 -30
  74. package/dist/src/graphql/reactor/subgraph.d.ts +2 -31
  75. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
  76. package/dist/src/graphql/reactor/subgraph.js +132 -209
  77. package/dist/src/graphql/reactor/subgraph.js.map +1 -1
  78. package/dist/src/graphql/reactor/validation.d.ts +208 -20
  79. package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
  80. package/dist/src/graphql/reactor/validation.js +90 -4
  81. package/dist/src/graphql/reactor/validation.js.map +1 -1
  82. package/dist/src/graphql/system/index.d.ts +0 -1
  83. package/dist/src/graphql/system/index.d.ts.map +1 -1
  84. package/dist/src/graphql/system/index.js +0 -1
  85. package/dist/src/graphql/system/index.js.map +1 -1
  86. package/dist/src/graphql/types.d.ts +6 -8
  87. package/dist/src/graphql/types.d.ts.map +1 -1
  88. package/dist/src/graphql/utils.d.ts +1 -18
  89. package/dist/src/graphql/utils.d.ts.map +1 -1
  90. package/dist/src/graphql/utils.js +7 -35
  91. package/dist/src/graphql/utils.js.map +1 -1
  92. package/dist/src/migrations/002_add_document_protection.d.ts +4 -0
  93. package/dist/src/migrations/002_add_document_protection.d.ts.map +1 -0
  94. package/dist/src/migrations/002_add_document_protection.js +18 -0
  95. package/dist/src/migrations/002_add_document_protection.js.map +1 -0
  96. package/dist/src/migrations/index.d.ts.map +1 -1
  97. package/dist/src/migrations/index.js +2 -0
  98. package/dist/src/migrations/index.js.map +1 -1
  99. package/dist/src/packages/http-loader.d.ts +68 -0
  100. package/dist/src/packages/http-loader.d.ts.map +1 -0
  101. package/dist/src/packages/http-loader.js +176 -0
  102. package/dist/src/packages/http-loader.js.map +1 -0
  103. package/dist/src/packages/https-hooks.d.mts +23 -0
  104. package/dist/src/packages/https-hooks.d.mts.map +1 -0
  105. package/dist/src/packages/https-hooks.mjs +59 -0
  106. package/dist/src/packages/https-hooks.mjs.map +1 -0
  107. package/dist/src/packages/import-loader.d.ts +5 -3
  108. package/dist/src/packages/import-loader.d.ts.map +1 -1
  109. package/dist/src/packages/import-loader.js +19 -10
  110. package/dist/src/packages/import-loader.js.map +1 -1
  111. package/dist/src/packages/package-manager.d.ts +2 -2
  112. package/dist/src/packages/package-manager.d.ts.map +1 -1
  113. package/dist/src/packages/package-manager.js.map +1 -1
  114. package/dist/src/packages/types.d.ts +9 -4
  115. package/dist/src/packages/types.d.ts.map +1 -1
  116. package/dist/src/packages/util.d.ts +3 -2
  117. package/dist/src/packages/util.d.ts.map +1 -1
  118. package/dist/src/packages/util.js +1 -1
  119. package/dist/src/packages/util.js.map +1 -1
  120. package/dist/src/packages/vite-loader.d.ts +10 -8
  121. package/dist/src/packages/vite-loader.d.ts.map +1 -1
  122. package/dist/src/packages/vite-loader.js +33 -10
  123. package/dist/src/packages/vite-loader.js.map +1 -1
  124. package/dist/src/server.d.ts +14 -11
  125. package/dist/src/server.d.ts.map +1 -1
  126. package/dist/src/server.js +153 -92
  127. package/dist/src/server.js.map +1 -1
  128. package/dist/src/services/auth.service.d.ts +0 -12
  129. package/dist/src/services/auth.service.d.ts.map +1 -1
  130. package/dist/src/services/auth.service.js +13 -40
  131. package/dist/src/services/auth.service.js.map +1 -1
  132. package/dist/src/services/authorization.service.d.ts +70 -0
  133. package/dist/src/services/authorization.service.d.ts.map +1 -0
  134. package/dist/src/services/authorization.service.js +155 -0
  135. package/dist/src/services/authorization.service.js.map +1 -0
  136. package/dist/src/services/document-permission.service.d.ts +47 -7
  137. package/dist/src/services/document-permission.service.d.ts.map +1 -1
  138. package/dist/src/services/document-permission.service.js +162 -7
  139. package/dist/src/services/document-permission.service.js.map +1 -1
  140. package/dist/src/services/package-management.service.d.ts +32 -0
  141. package/dist/src/services/package-management.service.d.ts.map +1 -0
  142. package/dist/src/services/package-management.service.js +95 -0
  143. package/dist/src/services/package-management.service.js.map +1 -0
  144. package/dist/src/services/package-storage.d.ts +23 -0
  145. package/dist/src/services/package-storage.d.ts.map +1 -0
  146. package/dist/src/services/package-storage.js +19 -0
  147. package/dist/src/services/package-storage.js.map +1 -0
  148. package/dist/src/tracing.d.ts.map +1 -1
  149. package/dist/src/tracing.js +19 -1
  150. package/dist/src/tracing.js.map +1 -1
  151. package/dist/src/types.d.ts +5 -5
  152. package/dist/src/types.d.ts.map +1 -1
  153. package/dist/src/utils/auth.d.ts +1 -1
  154. package/dist/src/utils/auth.d.ts.map +1 -1
  155. package/dist/src/utils/auth.js +5 -12
  156. package/dist/src/utils/auth.js.map +1 -1
  157. package/dist/src/utils/create-schema.d.ts +25 -6
  158. package/dist/src/utils/create-schema.d.ts.map +1 -1
  159. package/dist/src/utils/create-schema.js +294 -22
  160. package/dist/src/utils/create-schema.js.map +1 -1
  161. package/dist/src/utils/db.d.ts +8 -0
  162. package/dist/src/utils/db.d.ts.map +1 -1
  163. package/dist/src/utils/db.js.map +1 -1
  164. package/dist/src/utils/drive-url.d.ts +2 -0
  165. package/dist/src/utils/drive-url.d.ts.map +1 -0
  166. package/dist/src/utils/drive-url.js +3 -0
  167. package/dist/src/utils/drive-url.js.map +1 -0
  168. package/dist/src/utils/index.d.ts +1 -0
  169. package/dist/src/utils/index.d.ts.map +1 -1
  170. package/dist/src/utils/index.js +1 -0
  171. package/dist/src/utils/index.js.map +1 -1
  172. package/dist/test/authorization.service.test.d.ts +2 -0
  173. package/dist/test/authorization.service.test.d.ts.map +1 -0
  174. package/dist/test/authorization.service.test.js +252 -0
  175. package/dist/test/authorization.service.test.js.map +1 -0
  176. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +2 -0
  177. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +1 -0
  178. package/dist/test/connect-switchboard-reshuffle-convergence.test.js +203 -0
  179. package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +1 -0
  180. package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
  181. package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
  182. package/dist/test/connect-switchboard-sync.test.js +581 -0
  183. package/dist/test/connect-switchboard-sync.test.js.map +1 -0
  184. package/dist/test/document-drive-subgraph.test.d.ts +2 -0
  185. package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
  186. package/dist/test/document-drive-subgraph.test.js +186 -0
  187. package/dist/test/document-drive-subgraph.test.js.map +1 -0
  188. package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
  189. package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
  190. package/dist/test/document-model-subgraph-permissions.test.js +563 -0
  191. package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
  192. package/dist/test/drive-info-endpoint.test.d.ts +2 -0
  193. package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
  194. package/dist/test/drive-info-endpoint.test.js +123 -0
  195. package/dist/test/drive-info-endpoint.test.js.map +1 -0
  196. package/dist/test/index.d.ts +0 -1
  197. package/dist/test/index.d.ts.map +1 -1
  198. package/dist/test/index.js +0 -1
  199. package/dist/test/index.js.map +1 -1
  200. package/dist/test/permissions-integration.test.js +6 -20
  201. package/dist/test/permissions-integration.test.js.map +1 -1
  202. package/dist/test/push-backfill.test.d.ts +2 -0
  203. package/dist/test/push-backfill.test.d.ts.map +1 -0
  204. package/dist/test/push-backfill.test.js +298 -0
  205. package/dist/test/push-backfill.test.js.map +1 -0
  206. package/dist/test/reactor-client.test.js +87 -13
  207. package/dist/test/reactor-client.test.js.map +1 -1
  208. package/dist/test/reactor-resolvers.test.js +8 -11
  209. package/dist/test/reactor-resolvers.test.js.map +1 -1
  210. package/dist/test/reactor-subgraph-permissions.test.js +7 -36
  211. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
  212. package/dist/test/subscriptions.test.js +2 -0
  213. package/dist/test/subscriptions.test.js.map +1 -1
  214. package/dist/test/utils/gql-resolver-bridge.d.ts +4 -1
  215. package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
  216. package/dist/test/utils/gql-resolver-bridge.js +36 -7
  217. package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
  218. package/dist/tsconfig.tsbuildinfo +1 -1
  219. package/package.json +46 -55
  220. package/dist/src/graphql/drive-subgraph.d.ts +0 -25
  221. package/dist/src/graphql/drive-subgraph.d.ts.map +0 -1
  222. package/dist/src/graphql/drive-subgraph.js +0 -487
  223. package/dist/src/graphql/drive-subgraph.js.map +0 -1
  224. package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
  225. package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
  226. package/dist/src/graphql/system/system-subgraph.js +0 -130
  227. package/dist/src/graphql/system/system-subgraph.js.map +0 -1
  228. package/dist/src/sync/types.d.ts +0 -10
  229. package/dist/src/sync/types.d.ts.map +0 -1
  230. package/dist/src/sync/types.js +0 -2
  231. package/dist/src/sync/types.js.map +0 -1
  232. package/dist/src/sync/utils.d.ts +0 -7
  233. package/dist/src/sync/utils.d.ts.map +0 -1
  234. package/dist/src/sync/utils.js +0 -78
  235. package/dist/src/sync/utils.js.map +0 -1
  236. package/dist/test/drive-handlers.d.ts +0 -4
  237. package/dist/test/drive-handlers.d.ts.map +0 -1
  238. package/dist/test/drive-handlers.js +0 -39
  239. package/dist/test/drive-handlers.js.map +0 -1
  240. package/dist/test/drive-subgraph-permissions.test.d.ts +0 -2
  241. package/dist/test/drive-subgraph-permissions.test.d.ts.map +0 -1
  242. package/dist/test/drive-subgraph-permissions.test.js +0 -195
  243. package/dist/test/drive-subgraph-permissions.test.js.map +0 -1
  244. package/dist/test/drive.test.d.ts +0 -2
  245. package/dist/test/drive.test.d.ts.map +0 -1
  246. package/dist/test/drive.test.js +0 -142
  247. package/dist/test/drive.test.js.map +0 -1
  248. package/dist/test/pull-responder-transmitter.test.d.ts +0 -2
  249. package/dist/test/pull-responder-transmitter.test.d.ts.map +0 -1
  250. package/dist/test/pull-responder-transmitter.test.js +0 -220
  251. package/dist/test/pull-responder-transmitter.test.js.map +0 -1
  252. package/dist/test/push-transmitter.test.d.ts +0 -2
  253. package/dist/test/push-transmitter.test.d.ts.map +0 -1
  254. package/dist/test/push-transmitter.test.js +0 -179
  255. package/dist/test/push-transmitter.test.js.map +0 -1
  256. package/dist/test/system.test.d.ts +0 -2
  257. package/dist/test/system.test.d.ts.map +0 -1
  258. package/dist/test/system.test.js +0 -211
  259. package/dist/test/system.test.js.map +0 -1
  260. package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
  261. package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
  262. package/dist/test/three-reactor-gql-sync.test.js +0 -368
  263. package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
  264. package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
  265. package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
  266. package/dist/test/two-reactor-gql-sync.test.js +0 -348
  267. package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { GraphQLError } from "graphql";
1
2
  import { gql } from "graphql-tag";
2
3
  export class BaseSubgraph {
3
4
  name = "example";
@@ -12,23 +13,114 @@ export class BaseSubgraph {
12
13
  hello: String
13
14
  }
14
15
  `;
15
- reactor;
16
16
  reactorClient;
17
17
  graphqlManager;
18
18
  relationalDb;
19
19
  syncManager;
20
20
  documentPermissionService;
21
+ authorizationService;
21
22
  constructor(args) {
22
- this.reactor = args.reactor;
23
23
  this.reactorClient = args.reactorClient;
24
24
  this.graphqlManager = args.graphqlManager;
25
25
  this.relationalDb = args.relationalDb;
26
26
  this.syncManager = args.syncManager;
27
27
  this.documentPermissionService = args.documentPermissionService;
28
+ this.authorizationService = args.authorizationService;
28
29
  this.path = args.path ?? "";
29
30
  }
30
31
  async onSetup() {
31
32
  // noop
32
33
  }
34
+ // ============================================
35
+ // Shared permission helpers
36
+ // ============================================
37
+ getParentIdsFn() {
38
+ return async (documentId) => {
39
+ try {
40
+ const result = await this.reactorClient.getParents(documentId);
41
+ return result.results.map((doc) => doc.header.id);
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ };
47
+ }
48
+ hasGlobalAdminAccess(ctx) {
49
+ return !!ctx.isAdmin?.(ctx.user?.address ?? "");
50
+ }
51
+ async canReadDocument(documentId, ctx) {
52
+ if (this.authorizationService) {
53
+ return this.authorizationService.canRead(documentId, ctx.user?.address, this.getParentIdsFn());
54
+ }
55
+ if (this.hasGlobalAdminAccess(ctx))
56
+ return true;
57
+ if (this.documentPermissionService) {
58
+ return this.documentPermissionService.canRead(documentId, ctx.user?.address, this.getParentIdsFn());
59
+ }
60
+ return false;
61
+ }
62
+ async assertCanRead(documentId, ctx) {
63
+ if (this.authorizationService) {
64
+ const canRead = await this.authorizationService.canRead(documentId, ctx.user?.address, this.getParentIdsFn());
65
+ if (!canRead) {
66
+ throw new GraphQLError("Forbidden: insufficient permissions to read this document");
67
+ }
68
+ return;
69
+ }
70
+ // Legacy fallback
71
+ if (!this.hasGlobalAdminAccess(ctx)) {
72
+ if (this.documentPermissionService) {
73
+ const canRead = await this.documentPermissionService.canRead(documentId, ctx.user?.address, this.getParentIdsFn());
74
+ if (!canRead) {
75
+ throw new GraphQLError("Forbidden: insufficient permissions to read this document");
76
+ }
77
+ }
78
+ else {
79
+ throw new GraphQLError("Forbidden: insufficient permissions to read this document");
80
+ }
81
+ }
82
+ }
83
+ async assertCanWrite(documentId, ctx) {
84
+ if (this.authorizationService) {
85
+ const canWrite = await this.authorizationService.canWrite(documentId, ctx.user?.address, this.getParentIdsFn());
86
+ if (!canWrite) {
87
+ throw new GraphQLError("Forbidden: insufficient permissions to write to this document");
88
+ }
89
+ return;
90
+ }
91
+ // Legacy fallback
92
+ if (!this.hasGlobalAdminAccess(ctx)) {
93
+ if (this.documentPermissionService) {
94
+ const canWrite = await this.documentPermissionService.canWrite(documentId, ctx.user?.address, this.getParentIdsFn());
95
+ if (!canWrite) {
96
+ throw new GraphQLError("Forbidden: insufficient permissions to write to this document");
97
+ }
98
+ }
99
+ else {
100
+ throw new GraphQLError("Forbidden: insufficient permissions to write to this document");
101
+ }
102
+ }
103
+ }
104
+ async assertCanExecuteOperation(documentId, operationType, ctx) {
105
+ if (this.authorizationService) {
106
+ const canMutate = await this.authorizationService.canMutate(documentId, operationType, ctx.user?.address, this.getParentIdsFn());
107
+ if (!canMutate) {
108
+ throw new GraphQLError(`Forbidden: insufficient permissions to execute operation "${operationType}" on this document`);
109
+ }
110
+ return;
111
+ }
112
+ // Legacy fallback
113
+ if (!this.documentPermissionService)
114
+ return;
115
+ if (ctx.isAdmin?.(ctx.user?.address ?? ""))
116
+ return;
117
+ const isRestricted = await this.documentPermissionService.isOperationRestricted(documentId, operationType);
118
+ if (isRestricted) {
119
+ const canExecute = await this.documentPermissionService.canExecuteOperation(documentId, operationType, ctx.user?.address);
120
+ if (!canExecute) {
121
+ throw new GraphQLError(`Forbidden: insufficient permissions to execute operation "${operationType}" on this document`);
122
+ }
123
+ }
124
+ }
33
125
  }
34
126
  //# sourceMappingURL=base-subgraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-subgraph.js","sourceRoot":"","sources":["../../../src/graphql/base-subgraph.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,MAAM,OAAO,YAAY;IACvB,IAAI,GAAG,SAAS,CAAC;IACjB,IAAI,GAAG,EAAE,CAAC;IACV,SAAS,GAAwB;QAC/B,KAAK,EAAE;YACL,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI;SACvB;KACF,CAAC;IACF,QAAQ,GAAiB,GAAG,CAAA;;;;GAI3B,CAAC;IACF,OAAO,CAAuB;IAC9B,aAAa,CAAiB;IAC9B,cAAc,CAAiB;IAC/B,YAAY,CAAgB;IAC5B,WAAW,CAAe;IAC1B,yBAAyB,CAA6B;IAEtD,YAAY,IAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO;IACT,CAAC;CACF"}
1
+ {"version":3,"file":"base-subgraph.js","sourceRoot":"","sources":["../../../src/graphql/base-subgraph.ts"],"names":[],"mappings":"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"}
@@ -1,51 +1,23 @@
1
- import { type IDocumentDriveServer } from "document-drive";
2
1
  import { type DocumentModelModule } from "document-model";
3
2
  import { BaseSubgraph } from "./base-subgraph.js";
4
3
  import type { SubgraphArgs } from "./types.js";
5
- export declare function generateDocumentModelResolversLegacy(documentModel: DocumentModelModule, reactor: IDocumentDriveServer): {
6
- Query: {
7
- [x: string]: () => {
8
- getDocument: (args: {
9
- docId: string;
10
- driveId: string;
11
- }) => Promise<{
12
- __typename?: string;
13
- id: string;
14
- name: string;
15
- documentType: string;
16
- revision: number;
17
- createdAtUtcIso: string;
18
- lastModifiedAtUtcIso: string;
19
- operations: import("./types.js").GqlOperation[];
20
- stateJSON: JSON;
21
- state: unknown;
22
- initialState: unknown;
23
- driveId: string;
24
- }>;
25
- getDocuments: (args: {
26
- driveId: string;
27
- }) => Promise<{
28
- __typename?: string;
29
- id: string;
30
- name: string;
31
- documentType: string;
32
- revision: number;
33
- createdAtUtcIso: string;
34
- lastModifiedAtUtcIso: string;
35
- operations: import("./types.js").GqlOperation[];
36
- stateJSON: JSON;
37
- state: unknown;
38
- initialState: unknown;
39
- driveId: string;
40
- }[]>;
41
- };
42
- };
43
- Mutation: {
44
- [x: string]: any;
45
- };
46
- };
47
- export declare class DocumentModelSubgraphLegacy extends BaseSubgraph {
4
+ /**
5
+ * New document model subgraph that uses reactorClient instead of legacy reactor.
6
+ * This class auto-generates GraphQL queries and mutations for a document model.
7
+ */
8
+ export declare class DocumentModelSubgraph extends BaseSubgraph {
48
9
  private documentModel;
49
10
  constructor(documentModel: DocumentModelModule, args: SubgraphArgs);
11
+ /**
12
+ * Generate __resolveType functions for union types found in the document model schema.
13
+ * Parses the state schema to find union definitions and their member types,
14
+ * then uses unique field presence to discriminate between member types at runtime.
15
+ */
16
+ private generateUnionResolvers;
17
+ /**
18
+ * Generate resolvers for this document model using reactorClient
19
+ * Uses flat queries (not nested) consistent with ReactorSubgraph patterns
20
+ */
21
+ private generateResolvers;
50
22
  }
51
23
  //# sourceMappingURL=document-model-subgraph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-model-subgraph.d.ts","sourceRoot":"","sources":["../../../src/graphql/document-model-subgraph.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAW,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAKnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,wBAAgB,oCAAoC,CAClD,aAAa,EAAE,mBAAmB,EAClC,OAAO,EAAE,oBAAoB;;;gCAiBK;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE;;;;;;;;;;;;;;iCA4BjC;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE;;;;;;;;;;;;;;;;;;;EA+EvD;AAED,qBAAa,2BAA4B,SAAQ,YAAY;IAC3D,OAAO,CAAC,aAAa,CAAsB;gBAE/B,aAAa,EAAE,mBAAmB,EAAE,IAAI,EAAE,YAAY;CAYnE"}
1
+ {"version":3,"file":"document-model-subgraph.d.ts","sourceRoot":"","sources":["../../../src/graphql/document-model-subgraph.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAMnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlD,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,YAAY,CAAC;AAExD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,OAAO,CAAC,aAAa,CAAsB;gBAE/B,aAAa,EAAE,mBAAmB,EAAE,IAAI,EAAE,YAAY;IAWlE;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAuE9B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CA4V1B"}
@@ -1,104 +1,302 @@
1
1
  import { camelCase, kebabCase } from "change-case";
2
- import { addFile } from "document-drive";
3
2
  import { setName } from "document-model";
4
- import { generateDocumentModelSchemaLegacy, getDocumentModelSchemaName, } from "../utils/create-schema.js";
3
+ import { GraphQLError, Kind, parse } from "graphql";
4
+ import { generateDocumentModelSchema, getDocumentModelSchemaName, } from "../utils/create-schema.js";
5
5
  import { BaseSubgraph } from "./base-subgraph.js";
6
- import { buildGraphQlDocument } from "./utils.js";
7
- export function generateDocumentModelResolversLegacy(documentModel, reactor) {
8
- const documentType = documentModel.documentModel.global.id;
9
- const documentName = getDocumentModelSchemaName(documentModel.documentModel.global);
10
- const operations = documentModel.documentModel.global.specifications
11
- .at(-1)
12
- ?.modules.flatMap((module) => module.operations.filter((op) => op.name)) ?? [];
13
- return {
14
- Query: {
15
- [documentName]: () => {
16
- return {
17
- getDocument: async (args) => {
18
- const { docId, driveId } = args;
19
- if (!docId) {
20
- throw new Error("Document id is required");
6
+ import { toGqlPhDocument } from "./reactor/adapters.js";
7
+ import { createEmptyDocument as createEmptyDocumentResolver, documentChildren as documentChildrenResolver, documentParents as documentParentsResolver, document as documentResolver, findDocuments as findDocumentsResolver, } from "./reactor/resolvers.js";
8
+ /**
9
+ * New document model subgraph that uses reactorClient instead of legacy reactor.
10
+ * This class auto-generates GraphQL queries and mutations for a document model.
11
+ */
12
+ export class DocumentModelSubgraph extends BaseSubgraph {
13
+ documentModel;
14
+ constructor(documentModel, args) {
15
+ super(args);
16
+ this.documentModel = documentModel;
17
+ this.name = kebabCase(documentModel.documentModel.global.name);
18
+ this.typeDefs = generateDocumentModelSchema(this.documentModel.documentModel.global, { useNewApi: true });
19
+ this.resolvers = this.generateResolvers();
20
+ }
21
+ /**
22
+ * Generate __resolveType functions for union types found in the document model schema.
23
+ * Parses the state schema to find union definitions and their member types,
24
+ * then uses unique field presence to discriminate between member types at runtime.
25
+ */
26
+ generateUnionResolvers() {
27
+ const documentName = getDocumentModelSchemaName(this.documentModel.documentModel.global);
28
+ const specification = this.documentModel.documentModel.global.specifications.at(-1);
29
+ if (!specification)
30
+ return {};
31
+ const globalSchema = specification.state.global.schema ?? "";
32
+ const localSchema = specification.state.local.schema ?? "";
33
+ const fullSchema = `${globalSchema}\n${localSchema}`;
34
+ if (!fullSchema.trim())
35
+ return {};
36
+ let ast;
37
+ try {
38
+ ast = parse(fullSchema);
39
+ }
40
+ catch {
41
+ return {};
42
+ }
43
+ // Build map: object type name -> field names
44
+ const objectFieldsMap = new Map();
45
+ for (const def of ast.definitions) {
46
+ if (def.kind === Kind.OBJECT_TYPE_DEFINITION) {
47
+ objectFieldsMap.set(def.name.value, def.fields?.map((f) => f.name.value) ?? []);
48
+ }
49
+ }
50
+ const resolvers = {};
51
+ for (const def of ast.definitions) {
52
+ if (def.kind !== Kind.UNION_TYPE_DEFINITION)
53
+ continue;
54
+ const unionName = def.name.value;
55
+ const memberTypes = def.types?.map((t) => t.name.value) ?? [];
56
+ if (memberTypes.length === 0)
57
+ continue;
58
+ // Compute unique fields per member type
59
+ const uniqueFields = {};
60
+ for (const memberType of memberTypes) {
61
+ const ownFields = objectFieldsMap.get(memberType) ?? [];
62
+ const otherFields = new Set(memberTypes
63
+ .filter((t) => t !== memberType)
64
+ .flatMap((t) => objectFieldsMap.get(t) ?? []));
65
+ uniqueFields[memberType] = ownFields.filter((f) => !otherFields.has(f));
66
+ }
67
+ const prefixedUnionName = `${documentName}_${unionName}`;
68
+ resolvers[prefixedUnionName] = {
69
+ __resolveType: (obj) => {
70
+ for (const memberType of memberTypes) {
71
+ const fields = uniqueFields[memberType] ?? [];
72
+ if (fields.length > 0 && fields.some((f) => f in obj)) {
73
+ return `${documentName}_${memberType}`;
21
74
  }
22
- if (driveId) {
23
- const docIds = await reactor.getDocuments(driveId);
24
- if (!docIds.includes(docId)) {
25
- throw new Error(`Document with id ${docId} is not part of ${driveId}`);
75
+ }
76
+ return `${documentName}_${memberTypes[0]}`;
77
+ },
78
+ };
79
+ }
80
+ return resolvers;
81
+ }
82
+ /**
83
+ * Generate resolvers for this document model using reactorClient
84
+ * Uses flat queries (not nested) consistent with ReactorSubgraph patterns
85
+ */
86
+ generateResolvers() {
87
+ const documentType = this.documentModel.documentModel.global.id;
88
+ const documentName = getDocumentModelSchemaName(this.documentModel.documentModel.global);
89
+ const operations = this.documentModel.documentModel.global.specifications
90
+ .at(-1)
91
+ ?.modules.flatMap((module) => module.operations.filter((op) => op.name)) ?? [];
92
+ return {
93
+ ...this.generateUnionResolvers(),
94
+ Query: {
95
+ // Flat query: Get a specific document by identifier
96
+ // Uses shared documentResolver from reactor/resolvers.ts
97
+ [`${documentName}_document`]: async (_, args, ctx) => {
98
+ const { identifier, view } = args;
99
+ if (!identifier) {
100
+ throw new GraphQLError("Document identifier is required");
101
+ }
102
+ // Use shared resolver function
103
+ const result = await documentResolver(this.reactorClient, {
104
+ identifier,
105
+ view,
106
+ });
107
+ // Validate document type
108
+ if (result.document.documentType !== documentType) {
109
+ throw new GraphQLError(`Document with id ${identifier} is not of type ${documentType}`);
110
+ }
111
+ // Check permissions
112
+ await this.assertCanRead(result.document.id, ctx);
113
+ // Return shared resolver result directly (matches PHDocument format)
114
+ return result;
115
+ },
116
+ // Flat query: Find documents by search criteria (type is built-in)
117
+ // Uses shared findDocumentsResolver from reactor/resolvers.ts
118
+ [`${documentName}_findDocuments`]: async (_, args, ctx) => {
119
+ const { search, view, paging } = args;
120
+ // Use shared resolver function with built-in type filter
121
+ const result = await findDocumentsResolver(this.reactorClient, {
122
+ search: {
123
+ type: documentType, // Type is built-in for this document model subgraph
124
+ parentId: search.parentId,
125
+ },
126
+ view,
127
+ paging,
128
+ });
129
+ // Filter by permission if needed
130
+ if (!this.hasGlobalAdminAccess(ctx) &&
131
+ this.documentPermissionService) {
132
+ const filteredItems = [];
133
+ for (const item of result.items) {
134
+ const canRead = await this.canReadDocument(item.id, ctx);
135
+ if (canRead) {
136
+ filteredItems.push(item);
26
137
  }
27
138
  }
28
- const doc = await reactor.getDocument(docId);
29
- if (doc.header.documentType !== documentType) {
30
- throw new Error(`Document with id ${docId} is not of type ${documentType}`);
31
- }
32
139
  return {
33
- driveId: driveId,
34
- ...buildGraphQlDocument(doc),
140
+ ...result,
141
+ items: filteredItems,
142
+ totalCount: filteredItems.length,
35
143
  };
36
- },
37
- getDocuments: async (args) => {
38
- const { driveId } = args;
39
- const docsIds = await reactor.getDocuments(driveId);
40
- const docs = await Promise.all(docsIds.map(async (docId) => {
41
- const doc = await reactor.getDocument(docId);
42
- return {
43
- driveId: driveId,
44
- ...buildGraphQlDocument(doc),
45
- };
46
- }));
47
- return docs.filter((doc) => doc.documentType === documentType);
48
- },
49
- };
144
+ }
145
+ // Return shared resolver result directly (matches PHDocument format)
146
+ return result;
147
+ },
148
+ // Flat query: Get children of a document (filtered by this document type)
149
+ // Uses shared documentChildrenResolver from reactor/resolvers.ts
150
+ [`${documentName}_documentChildren`]: async (_, args, ctx) => {
151
+ const { parentIdentifier, view, paging } = args;
152
+ await this.assertCanRead(parentIdentifier, ctx);
153
+ // Use shared resolver function
154
+ const result = await documentChildrenResolver(this.reactorClient, {
155
+ parentIdentifier,
156
+ view,
157
+ paging,
158
+ });
159
+ // Filter children by this document type
160
+ const filteredItems = result.items.filter((item) => item.documentType === documentType);
161
+ return {
162
+ ...result,
163
+ items: filteredItems,
164
+ totalCount: filteredItems.length,
165
+ };
166
+ },
167
+ // Flat query: Get parents of a document
168
+ // Uses shared documentParentsResolver from reactor/resolvers.ts
169
+ [`${documentName}_documentParents`]: async (_, args, ctx) => {
170
+ const { childIdentifier, view, paging } = args;
171
+ await this.assertCanRead(childIdentifier, ctx);
172
+ // Use shared resolver function - return directly
173
+ return documentParentsResolver(this.reactorClient, {
174
+ childIdentifier,
175
+ view,
176
+ paging,
177
+ });
178
+ },
50
179
  },
51
- },
52
- Mutation: {
53
- [`${documentName}_createDocument`]: async (_, args) => {
54
- const { driveId, name } = args;
55
- const document = await reactor.addDocument(documentType);
56
- if (driveId) {
57
- await reactor.addAction(driveId, addFile({
180
+ Mutation: {
181
+ // Uses shared createEmptyDocumentResolver from reactor/resolvers.ts
182
+ [`${documentName}_createDocument`]: async (_, args, ctx) => {
183
+ const { parentIdentifier, name } = args;
184
+ if (parentIdentifier) {
185
+ await this.assertCanWrite(parentIdentifier, ctx);
186
+ }
187
+ else if (this.authorizationService) {
188
+ if (!ctx.user?.address) {
189
+ throw new GraphQLError("Forbidden: authentication required to create documents");
190
+ }
191
+ }
192
+ else if (!this.hasGlobalAdminAccess(ctx)) {
193
+ throw new GraphQLError("Forbidden: insufficient permissions to create documents");
194
+ }
195
+ // Use shared resolver function - passes name so that
196
+ // createDocumentInDrive can set it on the drive node atomically
197
+ const createdDoc = await createEmptyDocumentResolver(this.reactorClient, {
198
+ documentType,
199
+ parentIdentifier,
58
200
  name,
59
- id: document.header.id,
60
- documentType: documentType,
61
- }));
62
- }
63
- if (name) {
64
- await reactor.addAction(document.header.id, setName(name));
65
- }
66
- return document.header.id;
67
- },
68
- ...operations.reduce((mutations, op) => {
69
- mutations[`${documentName}_${camelCase(op.name)}`] = async (_, args) => {
70
- const { docId, input } = args;
71
- const doc = await reactor.getDocument(docId);
72
- if (!doc) {
73
- throw new Error("Document not found");
201
+ });
202
+ // Auto-ownership: set creator as document owner
203
+ if (this.authorizationService &&
204
+ ctx.user?.address &&
205
+ createdDoc?.id) {
206
+ await this.documentPermissionService?.initializeDocumentProtection(createdDoc.id, ctx.user.address, this.authorizationService.config.defaultProtection);
74
207
  }
75
- const action = documentModel.actions[camelCase(op.name)];
76
- if (!action) {
77
- throw new Error(`Action ${op.name} not found`);
208
+ // If name was provided but parent was NOT a drive (so name wasn't
209
+ // set during creation), apply it via SET_NAME action
210
+ if (name && createdDoc.name !== name) {
211
+ const updatedDoc = await this.reactorClient.execute(createdDoc.id, "main", [setName(name)]);
212
+ return toGqlPhDocument(updatedDoc);
78
213
  }
79
- const result = await reactor.addAction(docId, action(input));
80
- if (result.status !== "SUCCESS") {
81
- throw new Error(result.error?.message ?? `Failed to ${op.name}`);
214
+ return createdDoc;
215
+ },
216
+ // Uses shared createEmptyDocumentResolver from reactor/resolvers.ts
217
+ [`${documentName}_createEmptyDocument`]: async (_, args, ctx) => {
218
+ const { parentIdentifier } = args;
219
+ if (parentIdentifier) {
220
+ await this.assertCanWrite(parentIdentifier, ctx);
82
221
  }
83
- const errorOp = result.operations.find((op) => op.error);
84
- if (errorOp) {
85
- throw new Error(errorOp.error);
222
+ else if (this.authorizationService) {
223
+ if (!ctx.user?.address) {
224
+ throw new GraphQLError("Forbidden: authentication required to create documents");
225
+ }
86
226
  }
87
- return result.operations.at(-1)?.index ?? -1;
88
- };
89
- return mutations;
90
- }, {}),
91
- },
92
- };
93
- }
94
- export class DocumentModelSubgraphLegacy extends BaseSubgraph {
95
- documentModel;
96
- constructor(documentModel, args) {
97
- super(args);
98
- this.documentModel = documentModel;
99
- this.name = kebabCase(documentModel.documentModel.global.name);
100
- this.typeDefs = generateDocumentModelSchemaLegacy(this.documentModel.documentModel.global);
101
- this.resolvers = generateDocumentModelResolversLegacy(this.documentModel, args.reactor);
227
+ else if (!this.hasGlobalAdminAccess(ctx)) {
228
+ throw new GraphQLError("Forbidden: insufficient permissions to create documents");
229
+ }
230
+ // Use shared resolver function - returns PHDocument format directly
231
+ const result = await createEmptyDocumentResolver(this.reactorClient, {
232
+ documentType,
233
+ parentIdentifier,
234
+ });
235
+ // Auto-ownership: set creator as document owner
236
+ if (this.authorizationService && ctx.user?.address && result?.id) {
237
+ await this.documentPermissionService?.initializeDocumentProtection(result.id, ctx.user.address, this.authorizationService.config.defaultProtection);
238
+ }
239
+ return result;
240
+ },
241
+ // Generate sync and async mutations for each operation
242
+ ...operations.reduce((mutations, op) => {
243
+ // Sync mutation
244
+ mutations[`${documentName}_${camelCase(op.name)}`] = async (_, args, ctx) => {
245
+ const { docId, input } = args;
246
+ // assertCanExecuteOperation uses canMutate (write + operation) when
247
+ // authorizationService is available. Legacy fallback needs separate write check.
248
+ if (!this.authorizationService) {
249
+ await this.assertCanWrite(docId, ctx);
250
+ }
251
+ await this.assertCanExecuteOperation(docId, op.name, ctx);
252
+ const doc = await this.reactorClient.get(docId);
253
+ if (doc.header.documentType !== documentType) {
254
+ throw new GraphQLError(`Document with id ${docId} is not of type ${documentType}`);
255
+ }
256
+ const action = this.documentModel.actions[camelCase(op.name)];
257
+ if (!action) {
258
+ throw new GraphQLError(`Action ${op.name} not found`);
259
+ }
260
+ try {
261
+ const updatedDoc = await this.reactorClient.execute(docId, "main", [action(input)]);
262
+ // Use toGqlPhDocument for PHDocument format with revisionsList
263
+ return toGqlPhDocument(updatedDoc);
264
+ }
265
+ catch (error) {
266
+ throw new GraphQLError(error instanceof Error
267
+ ? error.message
268
+ : `Failed to ${op.name}`);
269
+ }
270
+ };
271
+ // Async mutation - returns job ID
272
+ mutations[`${documentName}_${camelCase(op.name)}Async`] = async (_, args, ctx) => {
273
+ const { docId, input } = args;
274
+ if (!this.authorizationService) {
275
+ await this.assertCanWrite(docId, ctx);
276
+ }
277
+ await this.assertCanExecuteOperation(docId, op.name, ctx);
278
+ const doc = await this.reactorClient.get(docId);
279
+ if (doc.header.documentType !== documentType) {
280
+ throw new GraphQLError(`Document with id ${docId} is not of type ${documentType}`);
281
+ }
282
+ const action = this.documentModel.actions[camelCase(op.name)];
283
+ if (!action) {
284
+ throw new GraphQLError(`Action ${op.name} not found`);
285
+ }
286
+ try {
287
+ const jobInfo = await this.reactorClient.executeAsync(docId, "main", [action(input)]);
288
+ return jobInfo.id;
289
+ }
290
+ catch (error) {
291
+ throw new GraphQLError(error instanceof Error
292
+ ? error.message
293
+ : `Failed to ${op.name}`);
294
+ }
295
+ };
296
+ return mutations;
297
+ }, {}),
298
+ },
299
+ };
102
300
  }
103
301
  }
104
302
  //# sourceMappingURL=document-model-subgraph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-model-subgraph.js","sourceRoot":"","sources":["../../../src/graphql/document-model-subgraph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document-model-subgraph.js","sourceRoot":"","sources":["../../../src/graphql/document-model-subgraph.ts"],"names":[],"mappings":"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"}