@powerhousedao/reactor-api 6.0.0-dev.7 → 6.0.0-dev.77

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
@@ -0,0 +1,563 @@
1
+ import { GraphQLError } from "graphql";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { DocumentModelSubgraph } from "../src/graphql/document-model-subgraph.js";
4
+ describe("DocumentModelSubgraph Permission Checks", () => {
5
+ let mockDocumentPermissionService;
6
+ let mockReactorClient;
7
+ let subgraph;
8
+ const mockDocumentModel = {
9
+ documentModel: {
10
+ global: {
11
+ id: "powerhouse/test-model",
12
+ name: "Test Model",
13
+ specifications: [
14
+ {
15
+ version: 1,
16
+ changeLog: [],
17
+ modules: [
18
+ {
19
+ name: "Base",
20
+ operations: [
21
+ { name: "SET_NAME" },
22
+ { name: "SET_VALUE" },
23
+ { name: "RESTRICTED_OP" },
24
+ ],
25
+ },
26
+ ],
27
+ state: { global: {}, local: {} },
28
+ },
29
+ ],
30
+ },
31
+ },
32
+ actions: {
33
+ setName: vi.fn((input) => ({ type: "SET_NAME", input })),
34
+ setValue: vi.fn((input) => ({ type: "SET_VALUE", input })),
35
+ restrictedOp: vi.fn((input) => ({ type: "RESTRICTED_OP", input })),
36
+ },
37
+ reducer: vi.fn(),
38
+ };
39
+ const createMockDocument = (id, name) => ({
40
+ header: {
41
+ id,
42
+ slug: id,
43
+ name,
44
+ documentType: "powerhouse/test-model",
45
+ revision: { global: 1 },
46
+ createdAtUtcIso: new Date().toISOString(),
47
+ lastModifiedAtUtcIso: new Date().toISOString(),
48
+ },
49
+ state: {
50
+ global: { name },
51
+ local: {},
52
+ },
53
+ initialState: {
54
+ global: { name },
55
+ local: {},
56
+ },
57
+ operations: {
58
+ global: [],
59
+ local: [],
60
+ },
61
+ attachments: {},
62
+ clipboard: [],
63
+ });
64
+ const mockDocument = createMockDocument("doc-123", "Test Document");
65
+ const createContext = (options) => ({
66
+ user: options.userAddress ? { address: options.userAddress } : undefined,
67
+ isAdmin: vi.fn().mockReturnValue(options.isAdmin ?? false),
68
+ });
69
+ beforeEach(() => {
70
+ vi.clearAllMocks();
71
+ mockDocumentPermissionService = {
72
+ canRead: vi.fn().mockResolvedValue(false),
73
+ canWrite: vi.fn().mockResolvedValue(false),
74
+ canReadDocument: vi.fn().mockResolvedValue(false),
75
+ canWriteDocument: vi.fn().mockResolvedValue(false),
76
+ isOperationRestricted: vi.fn().mockResolvedValue(false),
77
+ canExecuteOperation: vi.fn().mockResolvedValue(false),
78
+ };
79
+ mockReactorClient = {
80
+ getParents: vi.fn().mockResolvedValue({
81
+ results: [],
82
+ options: { limit: 10, cursor: "" },
83
+ }),
84
+ getChildren: vi.fn().mockResolvedValue({
85
+ results: [],
86
+ options: { limit: 10, cursor: "" },
87
+ }),
88
+ get: vi.fn().mockResolvedValue(mockDocument),
89
+ find: vi.fn().mockResolvedValue({
90
+ results: [mockDocument],
91
+ options: { limit: 10, cursor: "" },
92
+ }),
93
+ createEmpty: vi.fn().mockResolvedValue(mockDocument),
94
+ execute: vi.fn().mockResolvedValue({
95
+ ...mockDocument,
96
+ header: { ...mockDocument.header, revision: { global: 2 } },
97
+ }),
98
+ };
99
+ subgraph = new DocumentModelSubgraph(mockDocumentModel, {
100
+ reactorClient: mockReactorClient,
101
+ documentPermissionService: mockDocumentPermissionService,
102
+ relationalDb: {},
103
+ analyticsStore: {},
104
+ graphqlManager: {},
105
+ syncManager: {},
106
+ });
107
+ });
108
+ describe("Query: document", () => {
109
+ // Updated to match new flat resolver structure (TestModel_document instead of TestModel.getDocument)
110
+ const callGetDocument = async (ctx, identifier) => {
111
+ const queryResolver = subgraph.resolvers.Query
112
+ ?.TestModel_document;
113
+ return queryResolver(null, { identifier }, ctx);
114
+ };
115
+ describe("Global Admin Access", () => {
116
+ it("should allow access when user is global admin", async () => {
117
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
118
+ const result = await callGetDocument(ctx, "doc-123");
119
+ // Result is DocumentWithChildren: { document: PHDocument, childIds: string[] }
120
+ expect(result).toBeDefined();
121
+ expect(result.document.id).toBe("doc-123");
122
+ expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
123
+ });
124
+ });
125
+ describe("Document Permission Access", () => {
126
+ it("should check document permissions when no global access", async () => {
127
+ vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(true);
128
+ const ctx = createContext({ userAddress: "0xpermitted" });
129
+ const result = await callGetDocument(ctx, "doc-123");
130
+ expect(result).toBeDefined();
131
+ expect(mockDocumentPermissionService.canRead).toHaveBeenCalledWith("doc-123", "0xpermitted", expect.any(Function));
132
+ });
133
+ it("should deny access when user has no permissions", async () => {
134
+ vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
135
+ const ctx = createContext({ userAddress: "0xunpermitted" });
136
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow(GraphQLError);
137
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("Forbidden: insufficient permissions to read this document");
138
+ });
139
+ it("should deny access when user is not authenticated", async () => {
140
+ const ctx = createContext({});
141
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("Forbidden");
142
+ });
143
+ });
144
+ describe("Document validation", () => {
145
+ it("should throw error when identifier is not provided", async () => {
146
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
147
+ await expect(callGetDocument(ctx, "")).rejects.toThrow("Document identifier is required");
148
+ });
149
+ // Note: Drive validation is no longer part of document query in new API
150
+ // Documents are retrieved directly by identifier, parentId filtering is done via findDocuments
151
+ it.skip("should verify document is in specified drive when driveId provided", async () => {
152
+ mockReactorClient.find = vi.fn().mockResolvedValue({
153
+ results: [],
154
+ options: { limit: 10, cursor: "" },
155
+ });
156
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
157
+ // This test is no longer applicable - drive filtering is done via findDocuments
158
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("is not part of");
159
+ });
160
+ it("should throw error if document type does not match", async () => {
161
+ const wrongTypeDoc = {
162
+ ...mockDocument,
163
+ header: { ...mockDocument.header, documentType: "other/type" },
164
+ };
165
+ mockReactorClient.get = vi.fn().mockResolvedValue(wrongTypeDoc);
166
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
167
+ await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("is not of type");
168
+ });
169
+ });
170
+ describe("Permission inheritance (hierarchy)", () => {
171
+ it("should pass getParentIdsFn that retrieves parent IDs", async () => {
172
+ const mockParents = [
173
+ createMockDocument("parent-1", "Parent 1"),
174
+ createMockDocument("parent-2", "Parent 2"),
175
+ ];
176
+ vi.mocked(mockReactorClient.getParents).mockResolvedValue({
177
+ results: mockParents,
178
+ options: { limit: 10, cursor: "" },
179
+ });
180
+ let capturedGetParentsFn = null;
181
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (_docId, _user, getParentsFn) => {
182
+ capturedGetParentsFn = getParentsFn;
183
+ return true;
184
+ });
185
+ const ctx = createContext({ userAddress: "0xuser" });
186
+ await callGetDocument(ctx, "child-doc");
187
+ expect(capturedGetParentsFn).not.toBeNull();
188
+ const parentIds = await capturedGetParentsFn("child-doc");
189
+ expect(parentIds).toEqual(["parent-1", "parent-2"]);
190
+ });
191
+ it("should return empty array if getParents fails", async () => {
192
+ vi.mocked(mockReactorClient.getParents).mockRejectedValue(new Error("Not found"));
193
+ let capturedGetParentsFn = null;
194
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (_docId, _user, getParentsFn) => {
195
+ capturedGetParentsFn = getParentsFn;
196
+ return true;
197
+ });
198
+ const ctx = createContext({ userAddress: "0xuser" });
199
+ await callGetDocument(ctx, "child-doc");
200
+ const parentIds = await capturedGetParentsFn("child-doc");
201
+ expect(parentIds).toEqual([]);
202
+ });
203
+ });
204
+ describe("reactorClient integration", () => {
205
+ // Note: Drive filtering is now done via findDocuments, not document query
206
+ it.skip("should use reactorClient.find to check document in drive", async () => {
207
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
208
+ await callGetDocument(ctx, "doc-123");
209
+ // This test is no longer applicable - drive filtering is done via findDocuments
210
+ expect(mockReactorClient.find).toHaveBeenCalledWith({
211
+ parentId: "drive-1",
212
+ ids: ["doc-123"],
213
+ });
214
+ });
215
+ it("should use reactorClient.get to fetch document", async () => {
216
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
217
+ await callGetDocument(ctx, "doc-123");
218
+ // The shared resolver calls get with identifier and optional view
219
+ expect(mockReactorClient.get).toHaveBeenCalledWith("doc-123", undefined);
220
+ });
221
+ });
222
+ });
223
+ describe("Query: findDocuments", () => {
224
+ // Updated to match new flat resolver structure (TestModel_findDocuments)
225
+ const callFindDocuments = async (ctx, parentId) => {
226
+ const queryResolver = subgraph.resolvers.Query
227
+ ?.TestModel_findDocuments;
228
+ const result = await queryResolver(null, { search: { parentId }, paging: { limit: 10 } }, ctx);
229
+ return result.items;
230
+ };
231
+ describe("Global Role Access", () => {
232
+ it("should return all documents for admin", async () => {
233
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
234
+ const result = await callFindDocuments(ctx, "drive-1");
235
+ expect(result).toHaveLength(1);
236
+ expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
237
+ });
238
+ });
239
+ describe("Document Permission Filtering", () => {
240
+ beforeEach(() => {
241
+ const docs = [
242
+ createMockDocument("doc-1", "Doc 1"),
243
+ createMockDocument("doc-2", "Doc 2"),
244
+ createMockDocument("doc-3", "Doc 3"),
245
+ ];
246
+ mockReactorClient.find = vi.fn().mockResolvedValue({
247
+ results: docs,
248
+ options: { limit: 10, cursor: "" },
249
+ });
250
+ });
251
+ it("should filter documents based on permissions when no global access", async () => {
252
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (docId) => docId === "drive-1" || docId === "doc-1" || docId === "doc-3");
253
+ const ctx = createContext({ userAddress: "0xpartial" });
254
+ const result = await callFindDocuments(ctx, "drive-1");
255
+ expect(result).toHaveLength(2);
256
+ expect(result.map((d) => d.id).sort()).toEqual(["doc-1", "doc-3"]);
257
+ });
258
+ it("should return empty array when user has no document permissions", async () => {
259
+ vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (docId) => docId === "drive-1");
260
+ const ctx = createContext({ userAddress: "0xnopermissions" });
261
+ const result = await callFindDocuments(ctx, "drive-1");
262
+ expect(result).toHaveLength(0);
263
+ });
264
+ });
265
+ describe("Permission filtering", () => {
266
+ // Note: In the new API, findDocuments filters results based on individual document permissions
267
+ // rather than checking drive permission first
268
+ it("should filter documents when user has no global access", async () => {
269
+ vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
270
+ const ctx = createContext({ userAddress: "0xunpermitted" });
271
+ // With no permissions, all documents should be filtered out
272
+ const result = await callFindDocuments(ctx, "drive-1");
273
+ expect(result).toHaveLength(0);
274
+ });
275
+ });
276
+ describe("reactorClient integration", () => {
277
+ it("should use reactorClient.find with type filter", async () => {
278
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
279
+ await callFindDocuments(ctx, "drive-1");
280
+ // The shared resolver now uses find with these parameters - first call includes type filter
281
+ expect(mockReactorClient.find).toHaveBeenCalledWith(expect.objectContaining({
282
+ type: "powerhouse/test-model",
283
+ parentId: "drive-1",
284
+ }), undefined, expect.objectContaining({
285
+ limit: 10,
286
+ }));
287
+ });
288
+ });
289
+ });
290
+ describe("Mutation: createDocument", () => {
291
+ const callCreateDocument = async (ctx, name, parentIdentifier) => {
292
+ const mutation = subgraph.resolvers.Mutation
293
+ ?.TestModel_createDocument;
294
+ return mutation(null, { name, parentIdentifier }, ctx);
295
+ };
296
+ describe("Global Admin Access", () => {
297
+ it("should allow creation when user is global admin", async () => {
298
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
299
+ const result = await callCreateDocument(ctx, "New Doc");
300
+ expect(result).toMatchObject({ id: "doc-123" });
301
+ expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
302
+ });
303
+ });
304
+ describe("With parentIdentifier", () => {
305
+ it("should check write permission on parent when parentIdentifier provided", async () => {
306
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
307
+ const ctx = createContext({ userAddress: "0xpermitted" });
308
+ const result = await callCreateDocument(ctx, "New Doc", "drive-1");
309
+ expect(result).toMatchObject({ id: "doc-123" });
310
+ expect(mockDocumentPermissionService.canWrite).toHaveBeenCalledWith("drive-1", "0xpermitted", expect.any(Function));
311
+ });
312
+ it("should deny creation when user cannot write to parent", async () => {
313
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
314
+ const ctx = createContext({ userAddress: "0xunpermitted" });
315
+ await expect(callCreateDocument(ctx, "New Doc", "drive-1")).rejects.toThrow("Forbidden");
316
+ });
317
+ });
318
+ describe("Without parentIdentifier", () => {
319
+ it("should check global write access when no parentIdentifier", async () => {
320
+ const ctx = createContext({ userAddress: "0xnoglobal" });
321
+ await expect(callCreateDocument(ctx, "New Doc")).rejects.toThrow("Forbidden: insufficient permissions to create documents");
322
+ });
323
+ });
324
+ describe("reactorClient integration", () => {
325
+ it("should use reactorClient.createEmpty with parentIdentifier", async () => {
326
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
327
+ await callCreateDocument(ctx, "New Doc", "drive-1");
328
+ expect(mockReactorClient.createEmpty).toHaveBeenCalledWith("powerhouse/test-model", { parentIdentifier: "drive-1" });
329
+ });
330
+ it("should use reactorClient.execute to set name", async () => {
331
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
332
+ await callCreateDocument(ctx, "New Doc");
333
+ expect(mockReactorClient.execute).toHaveBeenCalledWith("doc-123", "main", [expect.objectContaining({ type: "SET_NAME" })]);
334
+ });
335
+ it("should not call execute if name is empty", async () => {
336
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
337
+ await callCreateDocument(ctx, "");
338
+ expect(mockReactorClient.createEmpty).toHaveBeenCalled();
339
+ expect(mockReactorClient.execute).not.toHaveBeenCalled();
340
+ });
341
+ });
342
+ });
343
+ describe("Mutation: operations (setName, setValue, etc.)", () => {
344
+ const callMutation = async (ctx, operationName, docId, input) => {
345
+ const mutation = subgraph.resolvers.Mutation?.[`TestModel_${operationName}`];
346
+ return mutation(null, { docId, input }, ctx);
347
+ };
348
+ describe("Write Permission Check", () => {
349
+ it("should check write permission before executing operation", async () => {
350
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
351
+ const ctx = createContext({ userAddress: "0xpermitted" });
352
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
353
+ expect(mockDocumentPermissionService.canWrite).toHaveBeenCalledWith("doc-123", "0xpermitted", expect.any(Function));
354
+ });
355
+ it("should deny operation when user cannot write", async () => {
356
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
357
+ const ctx = createContext({ userAddress: "0xunpermitted" });
358
+ await expect(callMutation(ctx, "setName", "doc-123", { name: "New Name" })).rejects.toThrow("Forbidden: insufficient permissions to write");
359
+ });
360
+ it("should allow operation for global admin without permission check", async () => {
361
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
362
+ const result = await callMutation(ctx, "setName", "doc-123", {
363
+ name: "New Name",
364
+ });
365
+ expect(result).toMatchObject({
366
+ id: "doc-123",
367
+ revisionsList: expect.arrayContaining([
368
+ expect.objectContaining({ scope: "global", revision: 2 }),
369
+ ]),
370
+ });
371
+ expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
372
+ });
373
+ });
374
+ describe("Operation-Level Permission Check", () => {
375
+ it("should check operation restriction after write permission", async () => {
376
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
377
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(false);
378
+ const ctx = createContext({ userAddress: "0xpermitted" });
379
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
380
+ expect(mockDocumentPermissionService.isOperationRestricted).toHaveBeenCalledWith("doc-123", "SET_NAME");
381
+ });
382
+ it("should allow operation when not restricted", async () => {
383
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
384
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(false);
385
+ const ctx = createContext({ userAddress: "0xpermitted" });
386
+ const result = await callMutation(ctx, "setName", "doc-123", {
387
+ name: "New Name",
388
+ });
389
+ expect(result).toMatchObject({
390
+ id: "doc-123",
391
+ revisionsList: expect.arrayContaining([
392
+ expect.objectContaining({ scope: "global", revision: 2 }),
393
+ ]),
394
+ });
395
+ expect(mockDocumentPermissionService.canExecuteOperation).not.toHaveBeenCalled();
396
+ });
397
+ it("should check operation permission when operation is restricted", async () => {
398
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
399
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
400
+ vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(true);
401
+ const ctx = createContext({ userAddress: "0xauthorized" });
402
+ const result = await callMutation(ctx, "restrictedOp", "doc-123", {
403
+ value: 42,
404
+ });
405
+ expect(result).toMatchObject({
406
+ id: "doc-123",
407
+ revisionsList: expect.arrayContaining([
408
+ expect.objectContaining({ scope: "global", revision: 2 }),
409
+ ]),
410
+ });
411
+ expect(mockDocumentPermissionService.canExecuteOperation).toHaveBeenCalledWith("doc-123", "RESTRICTED_OP", "0xauthorized");
412
+ });
413
+ it("should deny operation when user lacks operation permission", async () => {
414
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
415
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
416
+ vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(false);
417
+ const ctx = createContext({ userAddress: "0xunauthorized" });
418
+ await expect(callMutation(ctx, "restrictedOp", "doc-123", { value: 42 })).rejects.toThrow('Forbidden: insufficient permissions to execute operation "RESTRICTED_OP"');
419
+ });
420
+ it("should skip operation restriction check for global admin", async () => {
421
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
422
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
423
+ await callMutation(ctx, "restrictedOp", "doc-123", { value: 42 });
424
+ expect(mockDocumentPermissionService.isOperationRestricted).not.toHaveBeenCalled();
425
+ });
426
+ });
427
+ describe("Document type validation", () => {
428
+ it("should throw error when document type does not match", async () => {
429
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
430
+ const wrongTypeDoc = {
431
+ ...mockDocument,
432
+ header: { ...mockDocument.header, documentType: "other/type" },
433
+ };
434
+ mockReactorClient.get = vi.fn().mockResolvedValue(wrongTypeDoc);
435
+ const ctx = createContext({ userAddress: "0xpermitted" });
436
+ await expect(callMutation(ctx, "setName", "doc-123", { name: "New Name" })).rejects.toThrow("is not of type");
437
+ });
438
+ });
439
+ describe("reactorClient integration", () => {
440
+ it("should use reactorClient.get to verify document", async () => {
441
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
442
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
443
+ expect(mockReactorClient.get).toHaveBeenCalledWith("doc-123");
444
+ });
445
+ it("should use reactorClient.execute to apply action", async () => {
446
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
447
+ await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
448
+ expect(mockReactorClient.execute).toHaveBeenCalledWith("doc-123", "main", [expect.objectContaining({ type: "SET_NAME" })]);
449
+ });
450
+ it("should return PHDocument from updated document", async () => {
451
+ mockReactorClient.execute = vi.fn().mockResolvedValue({
452
+ ...mockDocument,
453
+ header: { ...mockDocument.header, revision: { global: 42 } },
454
+ });
455
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
456
+ const result = await callMutation(ctx, "setName", "doc-123", {
457
+ name: "New Name",
458
+ });
459
+ expect(result).toMatchObject({
460
+ id: "doc-123",
461
+ revisionsList: expect.arrayContaining([
462
+ expect.objectContaining({ scope: "global", revision: 42 }),
463
+ ]),
464
+ });
465
+ });
466
+ it("should handle execute errors gracefully", async () => {
467
+ mockReactorClient.execute = vi
468
+ .fn()
469
+ .mockRejectedValue(new Error("Execute failed"));
470
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
471
+ await expect(callMutation(ctx, "setName", "doc-123", { name: "New Name" })).rejects.toThrow("Execute failed");
472
+ });
473
+ });
474
+ });
475
+ describe("AUTH_ENABLED=false behavior", () => {
476
+ it("should allow all read access when admin role returns true", async () => {
477
+ const ctx = createContext({
478
+ isAdmin: true,
479
+ userAddress: "0xanyone",
480
+ });
481
+ const queryResolver = subgraph.resolvers.Query
482
+ ?.TestModel_document;
483
+ const result = await queryResolver(null, { identifier: "doc-123" }, ctx);
484
+ expect(result).toBeDefined();
485
+ expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
486
+ });
487
+ it("should allow all write access when admin role returns true", async () => {
488
+ const ctx = createContext({
489
+ isAdmin: true,
490
+ userAddress: "0xanyone",
491
+ });
492
+ const result = await subgraph.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx);
493
+ expect(result).toMatchObject({
494
+ id: "doc-123",
495
+ revisionsList: expect.arrayContaining([
496
+ expect.objectContaining({ scope: "global", revision: 2 }),
497
+ ]),
498
+ });
499
+ expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
500
+ });
501
+ });
502
+ describe("No Permission Service", () => {
503
+ let subgraphWithoutPermService;
504
+ beforeEach(() => {
505
+ subgraphWithoutPermService = new DocumentModelSubgraph(mockDocumentModel, {
506
+ reactorClient: mockReactorClient,
507
+ documentPermissionService: undefined,
508
+ relationalDb: {},
509
+ analyticsStore: {},
510
+ graphqlManager: {},
511
+ syncManager: {},
512
+ });
513
+ });
514
+ it("should deny read access when no permission service and no global access", async () => {
515
+ const ctx = createContext({ userAddress: "0xuser" });
516
+ const queryResolver = subgraphWithoutPermService.resolvers.Query
517
+ ?.TestModel_document;
518
+ await expect(queryResolver(null, { identifier: "doc-123" }, ctx)).rejects.toThrow("Forbidden");
519
+ });
520
+ it("should deny write access when no permission service and no global access", async () => {
521
+ const ctx = createContext({ userAddress: "0xuser" });
522
+ await expect(subgraphWithoutPermService.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx)).rejects.toThrow("Forbidden");
523
+ });
524
+ it("should allow access with global roles even without permission service", async () => {
525
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
526
+ const queryResolver = subgraphWithoutPermService.resolvers.Query
527
+ ?.TestModel_document;
528
+ const result = await queryResolver(null, { identifier: "doc-123" }, ctx);
529
+ expect(result).toBeDefined();
530
+ });
531
+ it("should skip operation restriction check when no permission service", async () => {
532
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
533
+ const result = await subgraphWithoutPermService.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx);
534
+ expect(result).toMatchObject({
535
+ id: "doc-123",
536
+ revisionsList: expect.arrayContaining([
537
+ expect.objectContaining({ scope: "global", revision: 2 }),
538
+ ]),
539
+ });
540
+ });
541
+ });
542
+ describe("Edge Cases", () => {
543
+ it("should handle empty user address in context", async () => {
544
+ const ctx = {
545
+ user: { address: "" },
546
+ isAdmin: vi.fn().mockReturnValue(false),
547
+ };
548
+ const queryResolver = subgraph.resolvers.Query
549
+ ?.TestModel_document;
550
+ await expect(queryResolver(null, { identifier: "doc-123" }, ctx)).rejects.toThrow("Forbidden");
551
+ expect(ctx.isAdmin).toHaveBeenCalledWith("");
552
+ });
553
+ it("should pass correct operation type name to permission check", async () => {
554
+ vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
555
+ vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
556
+ vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(true);
557
+ const ctx = createContext({ userAddress: "0xuser" });
558
+ await subgraph.resolvers.Mutation?.TestModel_setValue(null, { docId: "doc-123", input: { value: 42 } }, ctx);
559
+ expect(mockDocumentPermissionService.isOperationRestricted).toHaveBeenCalledWith("doc-123", "SET_VALUE");
560
+ });
561
+ });
562
+ });
563
+ //# sourceMappingURL=document-model-subgraph-permissions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-model-subgraph-permissions.test.js","sourceRoot":"","sources":["../../test/document-model-subgraph-permissions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=drive-info-endpoint.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-info-endpoint.test.d.ts","sourceRoot":"","sources":["../../test/drive-info-endpoint.test.ts"],"names":[],"mappings":""}