@powerhousedao/reactor-api 5.1.0-staging.0 → 5.2.0-staging.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/graphql/auth/index.d.ts +2 -0
  6. package/dist/src/graphql/auth/index.d.ts.map +1 -0
  7. package/dist/src/graphql/auth/index.js +2 -0
  8. package/dist/src/graphql/auth/index.js.map +1 -0
  9. package/dist/src/graphql/auth/resolvers.d.ts +149 -0
  10. package/dist/src/graphql/auth/resolvers.d.ts.map +1 -0
  11. package/dist/src/graphql/auth/resolvers.js +173 -0
  12. package/dist/src/graphql/auth/resolvers.js.map +1 -0
  13. package/dist/src/graphql/auth/schema.graphql +173 -0
  14. package/dist/src/graphql/auth/subgraph.d.ts +177 -0
  15. package/dist/src/graphql/auth/subgraph.d.ts.map +1 -0
  16. package/dist/src/graphql/auth/subgraph.js +340 -0
  17. package/dist/src/graphql/auth/subgraph.js.map +1 -0
  18. package/dist/src/graphql/base-subgraph.d.ts +3 -1
  19. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  20. package/dist/src/graphql/base-subgraph.js +2 -0
  21. package/dist/src/graphql/base-subgraph.js.map +1 -1
  22. package/dist/src/graphql/document-model-subgraph.d.ts +51 -0
  23. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -0
  24. package/dist/src/graphql/document-model-subgraph.js +104 -0
  25. package/dist/src/graphql/document-model-subgraph.js.map +1 -0
  26. package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
  27. package/dist/src/graphql/drive-subgraph.js +51 -10
  28. package/dist/src/graphql/drive-subgraph.js.map +1 -1
  29. package/dist/src/graphql/graphql-manager.d.ts +11 -3
  30. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  31. package/dist/src/graphql/graphql-manager.js +72 -16
  32. package/dist/src/graphql/graphql-manager.js.map +1 -1
  33. package/dist/src/graphql/index.d.ts +1 -0
  34. package/dist/src/graphql/index.d.ts.map +1 -1
  35. package/dist/src/graphql/index.js +1 -0
  36. package/dist/src/graphql/index.js.map +1 -1
  37. package/dist/src/graphql/reactor/resolvers.d.ts +6 -1
  38. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  39. package/dist/src/graphql/reactor/resolvers.js +18 -2
  40. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  41. package/dist/src/graphql/reactor/schema.graphql +4 -4
  42. package/dist/src/graphql/reactor/subgraph.d.ts +34 -0
  43. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
  44. package/dist/src/graphql/reactor/subgraph.js +258 -21
  45. package/dist/src/graphql/reactor/subgraph.js.map +1 -1
  46. package/dist/src/graphql/reactor/validation.d.ts +62 -62
  47. package/dist/src/graphql/system/system-subgraph.d.ts.map +1 -1
  48. package/dist/src/graphql/types.d.ts +4 -1
  49. package/dist/src/graphql/types.d.ts.map +1 -1
  50. package/dist/src/graphql/utils.js +1 -1
  51. package/dist/src/graphql/utils.js.map +1 -1
  52. package/dist/src/migrations/001_create_document_permissions.d.ts +4 -0
  53. package/dist/src/migrations/001_create_document_permissions.d.ts.map +1 -0
  54. package/dist/src/migrations/001_create_document_permissions.js +91 -0
  55. package/dist/src/migrations/001_create_document_permissions.js.map +1 -0
  56. package/dist/src/migrations/index.d.ts +10 -0
  57. package/dist/src/migrations/index.d.ts.map +1 -0
  58. package/dist/src/migrations/index.js +59 -0
  59. package/dist/src/migrations/index.js.map +1 -0
  60. package/dist/src/packages/util.js +1 -1
  61. package/dist/src/packages/util.js.map +1 -1
  62. package/dist/src/server.d.ts +17 -4
  63. package/dist/src/server.d.ts.map +1 -1
  64. package/dist/src/server.js +45 -16
  65. package/dist/src/server.js.map +1 -1
  66. package/dist/src/services/auth.service.d.ts +1 -0
  67. package/dist/src/services/auth.service.d.ts.map +1 -1
  68. package/dist/src/services/auth.service.js +30 -16
  69. package/dist/src/services/auth.service.js.map +1 -1
  70. package/dist/src/services/document-permission.service.d.ts +201 -0
  71. package/dist/src/services/document-permission.service.d.ts.map +1 -0
  72. package/dist/src/services/document-permission.service.js +636 -0
  73. package/dist/src/services/document-permission.service.js.map +1 -0
  74. package/dist/src/utils/create-schema.d.ts +4 -3
  75. package/dist/src/utils/create-schema.d.ts.map +1 -1
  76. package/dist/src/utils/create-schema.js +100 -3
  77. package/dist/src/utils/create-schema.js.map +1 -1
  78. package/dist/src/utils/db.d.ts +65 -1
  79. package/dist/src/utils/db.d.ts.map +1 -1
  80. package/dist/src/utils/db.js.map +1 -1
  81. package/dist/test/document-permission.service.test.d.ts +2 -0
  82. package/dist/test/document-permission.service.test.d.ts.map +1 -0
  83. package/dist/test/document-permission.service.test.js +480 -0
  84. package/dist/test/document-permission.service.test.js.map +1 -0
  85. package/dist/test/drive-subgraph-permissions.test.d.ts +2 -0
  86. package/dist/test/drive-subgraph-permissions.test.d.ts.map +1 -0
  87. package/dist/test/drive-subgraph-permissions.test.js +195 -0
  88. package/dist/test/drive-subgraph-permissions.test.js.map +1 -0
  89. package/dist/test/identity-integration.test.d.ts +2 -0
  90. package/dist/test/identity-integration.test.d.ts.map +1 -0
  91. package/dist/test/identity-integration.test.js +349 -0
  92. package/dist/test/identity-integration.test.js.map +1 -0
  93. package/dist/test/permissions-integration.test.d.ts +2 -0
  94. package/dist/test/permissions-integration.test.d.ts.map +1 -0
  95. package/dist/test/permissions-integration.test.js +421 -0
  96. package/dist/test/permissions-integration.test.js.map +1 -0
  97. package/dist/test/reactor-subgraph-permissions.test.d.ts +2 -0
  98. package/dist/test/reactor-subgraph-permissions.test.d.ts.map +1 -0
  99. package/dist/test/reactor-subgraph-permissions.test.js +400 -0
  100. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -0
  101. package/dist/test/two-reactor-gql-sync.test.js +11 -9
  102. package/dist/test/two-reactor-gql-sync.test.js.map +1 -1
  103. package/dist/test/utils/gql-resolver-bridge.js +4 -4
  104. package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
  105. package/dist/tsconfig.tsbuildinfo +1 -1
  106. package/package.json +9 -8
@@ -0,0 +1,421 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { ReactorSubgraph } from "../src/graphql/reactor/subgraph.js";
3
+ import { runMigrations } from "../src/migrations/index.js";
4
+ import { DocumentPermissionService } from "../src/services/document-permission.service.js";
5
+ import { getDbClient } from "../src/utils/db.js";
6
+ /**
7
+ * Integration tests for document permissions with the ReactorSubgraph.
8
+ * These tests use a real DocumentPermissionService with an in-memory database.
9
+ */
10
+ describe("Permissions Integration Tests", () => {
11
+ let documentPermissionService;
12
+ let mockReactorClient;
13
+ let reactorSubgraph;
14
+ let db;
15
+ // Mock document data
16
+ const createMockDocument = (id, name) => ({
17
+ header: {
18
+ id,
19
+ slug: id,
20
+ name,
21
+ documentType: "powerhouse/document-drive",
22
+ revision: { global: 1 },
23
+ createdAtUtcIso: new Date().toISOString(),
24
+ lastModifiedAtUtcIso: new Date().toISOString(),
25
+ },
26
+ state: {
27
+ global: { name },
28
+ local: {},
29
+ },
30
+ initialState: {
31
+ global: { name },
32
+ local: {},
33
+ },
34
+ operations: {
35
+ global: [],
36
+ local: [],
37
+ },
38
+ attachments: {},
39
+ clipboard: [],
40
+ });
41
+ const mockDocument = createMockDocument("doc-123", "Test Document");
42
+ const mockChildDocument = createMockDocument("child-doc", "Child Document");
43
+ const mockParentDocument = createMockDocument("parent-doc", "Parent Document");
44
+ // Context factory
45
+ const createContext = (options) => ({
46
+ user: options.userAddress ? { address: options.userAddress } : undefined,
47
+ isAdmin: () => options.isAdmin ?? false,
48
+ isUser: () => options.isUser ?? false,
49
+ isGuest: () => options.isGuest ?? false,
50
+ });
51
+ beforeEach(async () => {
52
+ vi.clearAllMocks();
53
+ // Create real in-memory database and permission service
54
+ const { db: dbClient } = getDbClient();
55
+ db = dbClient;
56
+ await runMigrations(db);
57
+ documentPermissionService = new DocumentPermissionService(db);
58
+ // Create mock ReactorClient with parent hierarchy
59
+ mockReactorClient = {
60
+ get: vi.fn().mockImplementation(async (id) => {
61
+ if (id === "doc-123")
62
+ return { document: mockDocument, childIds: [] };
63
+ if (id === "child-doc")
64
+ return { document: mockChildDocument, childIds: [] };
65
+ if (id === "parent-doc")
66
+ return { document: mockParentDocument, childIds: ["child-doc"] };
67
+ return { document: null, childIds: [] };
68
+ }),
69
+ getChildren: vi.fn().mockResolvedValue({
70
+ results: [],
71
+ options: { limit: 10, cursor: "" },
72
+ }),
73
+ getParents: vi.fn().mockImplementation(async (id) => {
74
+ // child-doc has parent-doc as parent
75
+ if (id === "child-doc") {
76
+ return {
77
+ results: [mockParentDocument],
78
+ options: { limit: 10, cursor: "" },
79
+ };
80
+ }
81
+ return {
82
+ results: [],
83
+ options: { limit: 10, cursor: "" },
84
+ };
85
+ }),
86
+ find: vi.fn().mockResolvedValue({
87
+ results: [mockDocument],
88
+ options: { limit: 10, cursor: "" },
89
+ }),
90
+ create: vi.fn().mockResolvedValue(mockDocument),
91
+ createEmpty: vi.fn().mockResolvedValue(mockDocument),
92
+ execute: vi.fn().mockResolvedValue(mockDocument),
93
+ executeAsync: vi.fn().mockResolvedValue("job-123"),
94
+ rename: vi.fn().mockResolvedValue(mockDocument),
95
+ addChildren: vi.fn().mockResolvedValue(mockParentDocument),
96
+ removeChildren: vi.fn().mockResolvedValue(mockParentDocument),
97
+ moveChildren: vi.fn().mockResolvedValue({
98
+ source: mockParentDocument,
99
+ target: mockParentDocument,
100
+ }),
101
+ deleteDocument: vi.fn().mockResolvedValue(true),
102
+ deleteDocuments: vi.fn().mockResolvedValue(true),
103
+ getDocumentModels: vi
104
+ .fn()
105
+ .mockResolvedValue({ results: [], options: {} }),
106
+ getJobStatus: vi.fn(),
107
+ waitForJob: vi.fn(),
108
+ subscribe: vi.fn(),
109
+ };
110
+ reactorSubgraph = new ReactorSubgraph({
111
+ reactorClient: mockReactorClient,
112
+ documentPermissionService,
113
+ reactor: {},
114
+ relationalDb: {},
115
+ analyticsStore: {},
116
+ graphqlManager: {},
117
+ });
118
+ });
119
+ afterEach(async () => {
120
+ await db.destroy();
121
+ });
122
+ describe("Document Query with Real Permission Service", () => {
123
+ const callDocument = async (ctx, identifier) => {
124
+ const query = reactorSubgraph.resolvers.Query?.document;
125
+ return query(null, { identifier }, ctx);
126
+ };
127
+ it("should deny access when user has no permission", async () => {
128
+ const ctx = createContext({ userAddress: "0xunpermitted" });
129
+ await expect(callDocument(ctx, "doc-123")).rejects.toThrow("Forbidden");
130
+ });
131
+ it("should allow access when user has READ permission", async () => {
132
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
133
+ const ctx = createContext({ userAddress: "0xuser" });
134
+ const result = await callDocument(ctx, "doc-123");
135
+ expect(result).toBeDefined();
136
+ expect(result.document.id).toBe("doc-123");
137
+ });
138
+ it("should allow access when user has WRITE permission", async () => {
139
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
140
+ const ctx = createContext({ userAddress: "0xuser" });
141
+ const result = await callDocument(ctx, "doc-123");
142
+ expect(result).toBeDefined();
143
+ });
144
+ it("should allow access when user has ADMIN permission", async () => {
145
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "ADMIN", "0xadmin");
146
+ const ctx = createContext({ userAddress: "0xuser" });
147
+ const result = await callDocument(ctx, "doc-123");
148
+ expect(result).toBeDefined();
149
+ });
150
+ it("should allow access via group permission", async () => {
151
+ const group = await documentPermissionService.createGroup("Readers");
152
+ await documentPermissionService.addUserToGroup("0xuser", group.id);
153
+ await documentPermissionService.grantGroupPermission("doc-123", group.id, "READ", "0xadmin");
154
+ const ctx = createContext({ userAddress: "0xuser" });
155
+ const result = await callDocument(ctx, "doc-123");
156
+ expect(result).toBeDefined();
157
+ });
158
+ it("should be case-insensitive for user addresses", async () => {
159
+ await documentPermissionService.grantPermission("doc-123", "0xABCDEF", "READ", "0xadmin");
160
+ const ctx = createContext({ userAddress: "0xabcdef" });
161
+ const result = await callDocument(ctx, "doc-123");
162
+ expect(result).toBeDefined();
163
+ });
164
+ });
165
+ describe("Permission Inheritance via Parent Hierarchy", () => {
166
+ const callDocument = async (ctx, identifier) => {
167
+ const query = reactorSubgraph.resolvers.Query?.document;
168
+ return query(null, { identifier }, ctx);
169
+ };
170
+ it("should allow access to child when user has permission on parent", async () => {
171
+ // Grant permission on parent document
172
+ await documentPermissionService.grantPermission("parent-doc", "0xuser", "READ", "0xadmin");
173
+ const ctx = createContext({ userAddress: "0xuser" });
174
+ // Should be able to access child document via inheritance
175
+ const result = await callDocument(ctx, "child-doc");
176
+ expect(result).toBeDefined();
177
+ expect(result.document.id).toBe("child-doc");
178
+ });
179
+ it("should deny access to child when user has no permission in hierarchy", async () => {
180
+ // Grant permission on different document (not in hierarchy)
181
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
182
+ const ctx = createContext({ userAddress: "0xuser" });
183
+ // Should not be able to access child document
184
+ await expect(callDocument(ctx, "child-doc")).rejects.toThrow("Forbidden");
185
+ });
186
+ it("should allow direct permission even without parent permission", async () => {
187
+ // Grant permission directly on child
188
+ await documentPermissionService.grantPermission("child-doc", "0xuser", "READ", "0xadmin");
189
+ const ctx = createContext({ userAddress: "0xuser" });
190
+ const result = await callDocument(ctx, "child-doc");
191
+ expect(result).toBeDefined();
192
+ });
193
+ it("should allow child access via group permission on parent", async () => {
194
+ const group = await documentPermissionService.createGroup("ParentReaders");
195
+ await documentPermissionService.addUserToGroup("0xuser", group.id);
196
+ await documentPermissionService.grantGroupPermission("parent-doc", group.id, "READ", "0xadmin");
197
+ const ctx = createContext({ userAddress: "0xuser" });
198
+ const result = await callDocument(ctx, "child-doc");
199
+ expect(result).toBeDefined();
200
+ });
201
+ });
202
+ describe("Mutation Permissions with Real Permission Service", () => {
203
+ describe("deleteDocument", () => {
204
+ const callDeleteDocument = async (ctx, identifier) => {
205
+ const mutation = reactorSubgraph.resolvers.Mutation
206
+ ?.deleteDocument;
207
+ return mutation(null, { identifier }, ctx);
208
+ };
209
+ it("should deny delete when user has only READ permission", async () => {
210
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
211
+ const ctx = createContext({ userAddress: "0xuser" });
212
+ await expect(callDeleteDocument(ctx, "doc-123")).rejects.toThrow("Forbidden");
213
+ });
214
+ it("should allow delete when user has WRITE permission", async () => {
215
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
216
+ const ctx = createContext({ userAddress: "0xuser" });
217
+ const result = await callDeleteDocument(ctx, "doc-123");
218
+ expect(result).toBe(true);
219
+ });
220
+ it("should allow delete when user has ADMIN permission", async () => {
221
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "ADMIN", "0xadmin");
222
+ const ctx = createContext({ userAddress: "0xuser" });
223
+ const result = await callDeleteDocument(ctx, "doc-123");
224
+ expect(result).toBe(true);
225
+ });
226
+ it("should allow delete via group WRITE permission", async () => {
227
+ const group = await documentPermissionService.createGroup("Writers");
228
+ await documentPermissionService.addUserToGroup("0xuser", group.id);
229
+ await documentPermissionService.grantGroupPermission("doc-123", group.id, "WRITE", "0xadmin");
230
+ const ctx = createContext({ userAddress: "0xuser" });
231
+ const result = await callDeleteDocument(ctx, "doc-123");
232
+ expect(result).toBe(true);
233
+ });
234
+ });
235
+ describe("moveChildren", () => {
236
+ const callMoveChildren = async (ctx, sourceId, targetId) => {
237
+ const mutation = reactorSubgraph.resolvers.Mutation
238
+ ?.moveChildren;
239
+ return mutation(null, {
240
+ sourceParentIdentifier: sourceId,
241
+ targetParentIdentifier: targetId,
242
+ documentIdentifiers: ["child-doc"],
243
+ }, ctx);
244
+ };
245
+ it("should deny move when user lacks write permission on source", async () => {
246
+ await documentPermissionService.grantPermission("parent-doc", "0xuser", "READ", "0xadmin");
247
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
248
+ const ctx = createContext({ userAddress: "0xuser" });
249
+ await expect(callMoveChildren(ctx, "parent-doc", "doc-123")).rejects.toThrow("Forbidden");
250
+ });
251
+ it("should deny move when user lacks write permission on target", async () => {
252
+ await documentPermissionService.grantPermission("parent-doc", "0xuser", "WRITE", "0xadmin");
253
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
254
+ const ctx = createContext({ userAddress: "0xuser" });
255
+ await expect(callMoveChildren(ctx, "parent-doc", "doc-123")).rejects.toThrow("Forbidden");
256
+ });
257
+ it("should allow move when user has write permission on both", async () => {
258
+ await documentPermissionService.grantPermission("parent-doc", "0xuser", "WRITE", "0xadmin");
259
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
260
+ const ctx = createContext({ userAddress: "0xuser" });
261
+ const result = await callMoveChildren(ctx, "parent-doc", "doc-123");
262
+ expect(result).toBeDefined();
263
+ });
264
+ });
265
+ });
266
+ describe("findDocuments Filtering with Real Permission Service", () => {
267
+ const callFindDocuments = async (ctx) => {
268
+ const query = reactorSubgraph.resolvers.Query?.findDocuments;
269
+ return query(null, { search: { type: "powerhouse/document-drive" } }, ctx);
270
+ };
271
+ beforeEach(() => {
272
+ // Setup find to return multiple documents
273
+ const doc1 = createMockDocument("doc-1", "Doc 1");
274
+ const doc2 = createMockDocument("doc-2", "Doc 2");
275
+ const doc3 = createMockDocument("doc-3", "Doc 3");
276
+ vi.mocked(mockReactorClient.find).mockResolvedValue({
277
+ results: [doc1, doc2, doc3],
278
+ options: { limit: 10 },
279
+ });
280
+ });
281
+ it("should filter results based on user permissions", async () => {
282
+ // Grant permission only on doc-1 and doc-3
283
+ await documentPermissionService.grantPermission("doc-1", "0xuser", "READ", "0xadmin");
284
+ await documentPermissionService.grantPermission("doc-3", "0xuser", "READ", "0xadmin");
285
+ const ctx = createContext({ userAddress: "0xuser" });
286
+ const result = await callFindDocuments(ctx);
287
+ expect(result.items).toHaveLength(2);
288
+ expect(result.items.map((d) => d.id).sort()).toEqual([
289
+ "doc-1",
290
+ "doc-3",
291
+ ]);
292
+ });
293
+ it("should return empty when user has no permissions", async () => {
294
+ const ctx = createContext({ userAddress: "0xunpermitted" });
295
+ const result = await callFindDocuments(ctx);
296
+ expect(result.items).toHaveLength(0);
297
+ });
298
+ it("should include documents accessible via groups", async () => {
299
+ const group = await documentPermissionService.createGroup("DocReaders");
300
+ await documentPermissionService.addUserToGroup("0xuser", group.id);
301
+ await documentPermissionService.grantGroupPermission("doc-2", group.id, "READ", "0xadmin");
302
+ const ctx = createContext({ userAddress: "0xuser" });
303
+ const result = await callFindDocuments(ctx);
304
+ expect(result.items).toHaveLength(1);
305
+ expect(result.items[0].id).toBe("doc-2");
306
+ });
307
+ });
308
+ describe("Global Role Override", () => {
309
+ const callDocument = async (ctx) => {
310
+ const query = reactorSubgraph.resolvers.Query?.document;
311
+ return query(null, { identifier: "doc-123" }, ctx);
312
+ };
313
+ it("should allow admin access without document permission", async () => {
314
+ // No document permission granted
315
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
316
+ const result = await callDocument(ctx);
317
+ expect(result).toBeDefined();
318
+ });
319
+ it("should allow user access without document permission", async () => {
320
+ // No document permission granted
321
+ const ctx = createContext({ isUser: true, userAddress: "0xuser" });
322
+ const result = await callDocument(ctx);
323
+ expect(result).toBeDefined();
324
+ });
325
+ it("should allow guest read access without document permission", async () => {
326
+ // No document permission granted
327
+ const ctx = createContext({ isGuest: true, userAddress: "0xguest" });
328
+ const result = await callDocument(ctx);
329
+ expect(result).toBeDefined();
330
+ });
331
+ it("global role should take precedence over document permission check", async () => {
332
+ // Grant conflicting permission (just to show global role wins)
333
+ await documentPermissionService.grantPermission("doc-123", "0xother", "READ", "0xadmin");
334
+ // This user has global admin but no document permission
335
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
336
+ const result = await callDocument(ctx);
337
+ expect(result).toBeDefined();
338
+ });
339
+ });
340
+ describe("Permission Revocation Flow", () => {
341
+ const callDocument = async (ctx) => {
342
+ const query = reactorSubgraph.resolvers.Query?.document;
343
+ return query(null, { identifier: "doc-123" }, ctx);
344
+ };
345
+ it("should deny access after permission is revoked", async () => {
346
+ // Grant permission
347
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
348
+ const ctx = createContext({ userAddress: "0xuser" });
349
+ // Should have access
350
+ const result1 = await callDocument(ctx);
351
+ expect(result1).toBeDefined();
352
+ // Revoke permission
353
+ await documentPermissionService.revokePermission("doc-123", "0xuser");
354
+ // Should no longer have access
355
+ await expect(callDocument(ctx)).rejects.toThrow("Forbidden");
356
+ });
357
+ it("should deny access after group membership is removed", async () => {
358
+ const group = await documentPermissionService.createGroup("TempReaders");
359
+ await documentPermissionService.addUserToGroup("0xuser", group.id);
360
+ await documentPermissionService.grantGroupPermission("doc-123", group.id, "READ", "0xadmin");
361
+ const ctx = createContext({ userAddress: "0xuser" });
362
+ // Should have access via group
363
+ const result1 = await callDocument(ctx);
364
+ expect(result1).toBeDefined();
365
+ // Remove from group
366
+ await documentPermissionService.removeUserFromGroup("0xuser", group.id);
367
+ // Should no longer have access
368
+ await expect(callDocument(ctx)).rejects.toThrow("Forbidden");
369
+ });
370
+ it("should deny access after group permission is revoked", async () => {
371
+ const group = await documentPermissionService.createGroup("TempReaders");
372
+ await documentPermissionService.addUserToGroup("0xuser", group.id);
373
+ await documentPermissionService.grantGroupPermission("doc-123", group.id, "READ", "0xadmin");
374
+ const ctx = createContext({ userAddress: "0xuser" });
375
+ // Should have access via group
376
+ const result1 = await callDocument(ctx);
377
+ expect(result1).toBeDefined();
378
+ // Revoke group permission
379
+ await documentPermissionService.revokeGroupPermission("doc-123", group.id);
380
+ // Should no longer have access
381
+ await expect(callDocument(ctx)).rejects.toThrow("Forbidden");
382
+ });
383
+ });
384
+ describe("Complex Permission Scenarios", () => {
385
+ it("should use highest permission from multiple groups", async () => {
386
+ const readersGroup = await documentPermissionService.createGroup("Readers");
387
+ const writersGroup = await documentPermissionService.createGroup("Writers");
388
+ await documentPermissionService.addUserToGroup("0xuser", readersGroup.id);
389
+ await documentPermissionService.addUserToGroup("0xuser", writersGroup.id);
390
+ await documentPermissionService.grantGroupPermission("doc-123", readersGroup.id, "READ", "0xadmin");
391
+ await documentPermissionService.grantGroupPermission("doc-123", writersGroup.id, "WRITE", "0xadmin");
392
+ const ctx = createContext({ userAddress: "0xuser" });
393
+ // Should be able to delete (requires WRITE)
394
+ const mutation = reactorSubgraph.resolvers.Mutation
395
+ ?.deleteDocument;
396
+ const result = await mutation(null, { identifier: "doc-123" }, ctx);
397
+ expect(result).toBe(true);
398
+ });
399
+ it("should combine direct and group permissions", async () => {
400
+ // User has direct READ on doc-123
401
+ await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
402
+ // User is in group with WRITE on different document (parent-doc)
403
+ const group = await documentPermissionService.createGroup("ParentWriters");
404
+ await documentPermissionService.addUserToGroup("0xuser", group.id);
405
+ await documentPermissionService.grantGroupPermission("parent-doc", group.id, "WRITE", "0xadmin");
406
+ const ctx = createContext({ userAddress: "0xuser" });
407
+ // Can read doc-123 (direct permission)
408
+ const query = reactorSubgraph.resolvers.Query?.document;
409
+ const readResult = await query(null, { identifier: "doc-123" }, ctx);
410
+ expect(readResult).toBeDefined();
411
+ // Cannot write doc-123 (only has READ)
412
+ const deleteMutation = reactorSubgraph.resolvers.Mutation
413
+ ?.deleteDocument;
414
+ await expect(deleteMutation(null, { identifier: "doc-123" }, ctx)).rejects.toThrow("Forbidden");
415
+ // Can write parent-doc (group permission)
416
+ const deleteParent = await deleteMutation(null, { identifier: "parent-doc" }, ctx);
417
+ expect(deleteParent).toBe(true);
418
+ });
419
+ });
420
+ });
421
+ //# sourceMappingURL=permissions-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-integration.test.js","sourceRoot":"","sources":["../../test/permissions-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reactor-subgraph-permissions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactor-subgraph-permissions.test.d.ts","sourceRoot":"","sources":["../../test/reactor-subgraph-permissions.test.ts"],"names":[],"mappings":""}