@powerhousedao/reactor-api 6.0.0-dev.67 → 6.0.0-dev.68

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 (90) hide show
  1. package/dist/index.d.ts +0 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +0 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/graphql/base-subgraph.d.ts +1 -2
  6. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  7. package/dist/src/graphql/base-subgraph.js +0 -2
  8. package/dist/src/graphql/base-subgraph.js.map +1 -1
  9. package/dist/src/graphql/document-model-subgraph.d.ts +0 -13
  10. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
  11. package/dist/src/graphql/document-model-subgraph.js +6 -150
  12. package/dist/src/graphql/document-model-subgraph.js.map +1 -1
  13. package/dist/src/graphql/graphql-manager.d.ts +9 -4
  14. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  15. package/dist/src/graphql/graphql-manager.js +45 -27
  16. package/dist/src/graphql/graphql-manager.js.map +1 -1
  17. package/dist/src/graphql/index.d.ts +0 -1
  18. package/dist/src/graphql/index.d.ts.map +1 -1
  19. package/dist/src/graphql/index.js +0 -1
  20. package/dist/src/graphql/index.js.map +1 -1
  21. package/dist/src/graphql/reactor/resolvers.d.ts +1 -0
  22. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  23. package/dist/src/graphql/reactor/resolvers.js +33 -4
  24. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  25. package/dist/src/graphql/types.d.ts +1 -4
  26. package/dist/src/graphql/types.d.ts.map +1 -1
  27. package/dist/src/graphql/utils.d.ts +1 -18
  28. package/dist/src/graphql/utils.d.ts.map +1 -1
  29. package/dist/src/graphql/utils.js +0 -32
  30. package/dist/src/graphql/utils.js.map +1 -1
  31. package/dist/src/server.d.ts +0 -5
  32. package/dist/src/server.d.ts.map +1 -1
  33. package/dist/src/server.js +5 -6
  34. package/dist/src/server.js.map +1 -1
  35. package/dist/src/utils/create-schema.d.ts +4 -5
  36. package/dist/src/utils/create-schema.d.ts.map +1 -1
  37. package/dist/src/utils/create-schema.js +5 -6
  38. package/dist/src/utils/create-schema.js.map +1 -1
  39. package/dist/test/document-model-subgraph-permissions.test.js +2 -12
  40. package/dist/test/document-model-subgraph-permissions.test.js.map +1 -1
  41. package/dist/test/index.d.ts +0 -1
  42. package/dist/test/index.d.ts.map +1 -1
  43. package/dist/test/index.js +0 -1
  44. package/dist/test/index.js.map +1 -1
  45. package/dist/test/permissions-integration.test.js +1 -1
  46. package/dist/test/permissions-integration.test.js.map +1 -1
  47. package/dist/test/reactor-subgraph-permissions.test.js +1 -1
  48. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +11 -11
  51. package/dist/src/graphql/drive-subgraph.d.ts +0 -25
  52. package/dist/src/graphql/drive-subgraph.d.ts.map +0 -1
  53. package/dist/src/graphql/drive-subgraph.js +0 -499
  54. package/dist/src/graphql/drive-subgraph.js.map +0 -1
  55. package/dist/src/sync/types.d.ts +0 -10
  56. package/dist/src/sync/types.d.ts.map +0 -1
  57. package/dist/src/sync/types.js +0 -2
  58. package/dist/src/sync/types.js.map +0 -1
  59. package/dist/src/sync/utils.d.ts +0 -7
  60. package/dist/src/sync/utils.d.ts.map +0 -1
  61. package/dist/src/sync/utils.js +0 -78
  62. package/dist/src/sync/utils.js.map +0 -1
  63. package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts +0 -2
  64. package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts.map +0 -1
  65. package/dist/test/document-model-subgraph-legacy-permissions.test.js +0 -460
  66. package/dist/test/document-model-subgraph-legacy-permissions.test.js.map +0 -1
  67. package/dist/test/document-model-subgraph.test.d.ts +0 -2
  68. package/dist/test/document-model-subgraph.test.d.ts.map +0 -1
  69. package/dist/test/document-model-subgraph.test.js +0 -439
  70. package/dist/test/document-model-subgraph.test.js.map +0 -1
  71. package/dist/test/drive-handlers.d.ts +0 -4
  72. package/dist/test/drive-handlers.d.ts.map +0 -1
  73. package/dist/test/drive-handlers.js +0 -39
  74. package/dist/test/drive-handlers.js.map +0 -1
  75. package/dist/test/drive-subgraph-permissions.test.d.ts +0 -2
  76. package/dist/test/drive-subgraph-permissions.test.d.ts.map +0 -1
  77. package/dist/test/drive-subgraph-permissions.test.js +0 -166
  78. package/dist/test/drive-subgraph-permissions.test.js.map +0 -1
  79. package/dist/test/drive.test.d.ts +0 -2
  80. package/dist/test/drive.test.d.ts.map +0 -1
  81. package/dist/test/drive.test.js +0 -142
  82. package/dist/test/drive.test.js.map +0 -1
  83. package/dist/test/pull-responder-transmitter.test.d.ts +0 -2
  84. package/dist/test/pull-responder-transmitter.test.d.ts.map +0 -1
  85. package/dist/test/pull-responder-transmitter.test.js +0 -220
  86. package/dist/test/pull-responder-transmitter.test.js.map +0 -1
  87. package/dist/test/push-transmitter.test.d.ts +0 -2
  88. package/dist/test/push-transmitter.test.d.ts.map +0 -1
  89. package/dist/test/push-transmitter.test.js +0 -179
  90. package/dist/test/push-transmitter.test.js.map +0 -1
@@ -1,78 +0,0 @@
1
- import { operationsToRevision } from "document-drive";
2
- // processes a strand update and returns a listener revision
3
- export const processPushUpdate = async (reactor, strand) => {
4
- const existingDocuments = strand.driveId
5
- ? await reactor.getDocuments(strand.driveId)
6
- : [];
7
- const isNewDocument = !existingDocuments.includes(strand.documentId);
8
- if (isNewDocument) {
9
- const result = await processPushNewDocument(reactor, strand);
10
- if (result.status !== "SUCCESS" || strand.operations.length === 0) {
11
- return result;
12
- }
13
- }
14
- const result = await reactor.queueOperations(strand.documentId, strand.operations);
15
- return {
16
- revision: operationsToRevision(result.operations),
17
- branch: strand.branch,
18
- documentId: strand.documentId,
19
- documentType: strand.documentType,
20
- driveId: strand.driveId,
21
- scope: strand.scope,
22
- status: result.status,
23
- error: result.error?.message,
24
- };
25
- };
26
- export const processPushNewDocument = async (reactor, strand) => {
27
- const listenerRevision = {
28
- revision: 0,
29
- branch: strand.branch,
30
- documentId: strand.documentId,
31
- documentType: strand.documentType,
32
- driveId: strand.driveId,
33
- scope: strand.scope,
34
- };
35
- try {
36
- const result = await reactor.queueDocument({
37
- id: strand.documentId,
38
- documentType: strand.documentType,
39
- });
40
- return {
41
- ...listenerRevision,
42
- revision: operationsToRevision(result.operations),
43
- status: result.status,
44
- error: result.error?.message,
45
- };
46
- }
47
- catch (error) {
48
- if (error instanceof Error &&
49
- error.constructor.name === "DocumentAlreadyExistsError") {
50
- return {
51
- ...listenerRevision,
52
- status: "SUCCESS",
53
- };
54
- }
55
- else {
56
- return {
57
- ...listenerRevision,
58
- status: "ERROR",
59
- error: error instanceof Error ? error.message : "Unknown error",
60
- };
61
- }
62
- }
63
- };
64
- // processes an acknowledge request and returns a boolean
65
- export const processAcknowledge = async (reactor, driveId, listenerId, revisions) => {
66
- // todo: use listener manager
67
- const listener = reactor.listeners.getListenerState(driveId, listenerId);
68
- const transmitter = listener.listener.transmitter;
69
- return transmitter.processAcknowledge(driveId, listenerId, revisions);
70
- };
71
- // processes a get strands request and returns a list of strand updates
72
- export const processGetStrands = async (reactor, driveId, listenerId, since) => {
73
- // todo: use listener manager
74
- const listener = reactor.listeners.getListenerState(driveId, listenerId);
75
- const transmitter = listener.listener.transmitter;
76
- return transmitter.getStrands({ since });
77
- };
78
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/sync/utils.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=document-model-subgraph-legacy-permissions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-model-subgraph-legacy-permissions.test.d.ts","sourceRoot":"","sources":["../../test/document-model-subgraph-legacy-permissions.test.ts"],"names":[],"mappings":""}
@@ -1,460 +0,0 @@
1
- import { GraphQLError } from "graphql";
2
- import { beforeEach, describe, expect, it, vi } from "vitest";
3
- import { DocumentModelSubgraphLegacy } from "../src/graphql/document-model-subgraph.js";
4
- describe("DocumentModelSubgraphLegacy Permission Checks", () => {
5
- let mockDocumentPermissionService;
6
- let mockReactor;
7
- let mockReactorClient;
8
- let subgraph;
9
- // Mock document model module
10
- const mockDocumentModel = {
11
- documentModel: {
12
- global: {
13
- id: "powerhouse/test-model",
14
- name: "Test Model",
15
- specifications: [
16
- {
17
- version: 1,
18
- changeLog: [],
19
- modules: [
20
- {
21
- name: "Base",
22
- operations: [
23
- { name: "SET_NAME" },
24
- { name: "SET_VALUE" },
25
- { name: "RESTRICTED_OP" },
26
- ],
27
- },
28
- ],
29
- state: { global: {}, local: {} },
30
- },
31
- ],
32
- },
33
- },
34
- actions: {
35
- setName: vi.fn((input) => ({ type: "SET_NAME", input })),
36
- setValue: vi.fn((input) => ({ type: "SET_VALUE", input })),
37
- restrictedOp: vi.fn((input) => ({ type: "RESTRICTED_OP", input })),
38
- },
39
- reducer: vi.fn(),
40
- };
41
- // Mock document
42
- const createMockDocument = (id, name) => ({
43
- header: {
44
- id,
45
- slug: id,
46
- name,
47
- documentType: "powerhouse/test-model",
48
- revision: { global: 1 },
49
- createdAtUtcIso: new Date().toISOString(),
50
- lastModifiedAtUtcIso: new Date().toISOString(),
51
- },
52
- state: {
53
- global: { name },
54
- local: {},
55
- },
56
- initialState: {
57
- global: { name },
58
- local: {},
59
- },
60
- operations: {
61
- global: [],
62
- local: [],
63
- },
64
- attachments: {},
65
- clipboard: [],
66
- });
67
- const mockDocument = createMockDocument("doc-123", "Test Document");
68
- // Helper to create context with different permission levels
69
- const createContext = (options) => ({
70
- user: options.userAddress ? { address: options.userAddress } : undefined,
71
- isAdmin: vi.fn().mockReturnValue(options.isAdmin ?? false),
72
- });
73
- beforeEach(() => {
74
- vi.clearAllMocks();
75
- // Create mock DocumentPermissionService
76
- mockDocumentPermissionService = {
77
- canRead: vi.fn().mockResolvedValue(false),
78
- canWrite: vi.fn().mockResolvedValue(false),
79
- canReadDocument: vi.fn().mockResolvedValue(false),
80
- canWriteDocument: vi.fn().mockResolvedValue(false),
81
- isOperationRestricted: vi.fn().mockResolvedValue(false),
82
- canExecuteOperation: vi.fn().mockResolvedValue(false),
83
- };
84
- // Create mock reactor (IDocumentDriveServer)
85
- mockReactor = {
86
- getDocument: vi.fn().mockResolvedValue(mockDocument),
87
- getDocuments: vi.fn().mockResolvedValue(["doc-123"]),
88
- addDocument: vi.fn().mockResolvedValue(mockDocument),
89
- addAction: vi.fn().mockResolvedValue({
90
- status: "SUCCESS",
91
- operations: [{ index: 1 }],
92
- }),
93
- };
94
- // Create mock ReactorClient
95
- mockReactorClient = {
96
- getParents: vi.fn().mockResolvedValue({
97
- results: [],
98
- options: { limit: 10, cursor: "" },
99
- }),
100
- };
101
- // Create subgraph instance
102
- subgraph = new DocumentModelSubgraphLegacy(mockDocumentModel, {
103
- reactor: mockReactor,
104
- reactorClient: mockReactorClient,
105
- documentPermissionService: mockDocumentPermissionService,
106
- relationalDb: {},
107
- graphqlManager: {},
108
- syncManager: {},
109
- });
110
- });
111
- describe("Query: getDocument", () => {
112
- const callGetDocument = async (ctx, docId, driveId) => {
113
- const queryResolver = subgraph.resolvers.Query?.TestModel;
114
- const queryObject = queryResolver(null, {}, ctx);
115
- return queryObject.getDocument({ docId, driveId });
116
- };
117
- describe("Global Admin Access", () => {
118
- it("should allow access when user is global admin", async () => {
119
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
120
- const result = await callGetDocument(ctx, "doc-123");
121
- expect(result).toBeDefined();
122
- expect(result.id).toBe("doc-123");
123
- expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
124
- });
125
- });
126
- describe("Document Permission Access", () => {
127
- it("should check document permissions when no global access", async () => {
128
- vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(true);
129
- const ctx = createContext({ userAddress: "0xpermitted" });
130
- const result = await callGetDocument(ctx, "doc-123");
131
- expect(result).toBeDefined();
132
- expect(mockDocumentPermissionService.canRead).toHaveBeenCalledWith("doc-123", "0xpermitted", expect.any(Function));
133
- });
134
- it("should deny access when user has no permissions", async () => {
135
- vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
136
- const ctx = createContext({ userAddress: "0xunpermitted" });
137
- await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow(GraphQLError);
138
- await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("Forbidden: insufficient permissions to read this document");
139
- });
140
- it("should deny access when user is not authenticated", async () => {
141
- const ctx = createContext({});
142
- await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("Forbidden");
143
- });
144
- });
145
- describe("Document validation", () => {
146
- it("should throw error when docId is not provided", async () => {
147
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
148
- await expect(callGetDocument(ctx, "")).rejects.toThrow("Document id is required");
149
- });
150
- it("should verify document is in specified drive when driveId provided", async () => {
151
- mockReactor.getDocuments = vi.fn().mockResolvedValue(["other-doc"]);
152
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
153
- await expect(callGetDocument(ctx, "doc-123", "drive-1")).rejects.toThrow("is not part of");
154
- });
155
- it("should throw error if document type does not match", async () => {
156
- const wrongTypeDoc = {
157
- ...mockDocument,
158
- header: { ...mockDocument.header, documentType: "other/type" },
159
- };
160
- mockReactor.getDocument = vi.fn().mockResolvedValue(wrongTypeDoc);
161
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
162
- await expect(callGetDocument(ctx, "doc-123")).rejects.toThrow("is not of type");
163
- });
164
- });
165
- describe("Permission inheritance (hierarchy)", () => {
166
- it("should pass getParentIdsFn that retrieves parent IDs", async () => {
167
- const mockParents = [
168
- createMockDocument("parent-1", "Parent 1"),
169
- createMockDocument("parent-2", "Parent 2"),
170
- ];
171
- vi.mocked(mockReactorClient.getParents).mockResolvedValue({
172
- results: mockParents,
173
- options: { limit: 10, cursor: "" },
174
- });
175
- let capturedGetParentsFn = null;
176
- vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (_docId, _user, getParentsFn) => {
177
- capturedGetParentsFn = getParentsFn;
178
- return true;
179
- });
180
- const ctx = createContext({ userAddress: "0xuser" });
181
- await callGetDocument(ctx, "child-doc");
182
- expect(capturedGetParentsFn).not.toBeNull();
183
- const parentIds = await capturedGetParentsFn("child-doc");
184
- expect(parentIds).toEqual(["parent-1", "parent-2"]);
185
- });
186
- it("should return empty array if getParents fails", async () => {
187
- vi.mocked(mockReactorClient.getParents).mockRejectedValue(new Error("Not found"));
188
- let capturedGetParentsFn = null;
189
- vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (_docId, _user, getParentsFn) => {
190
- capturedGetParentsFn = getParentsFn;
191
- return true;
192
- });
193
- const ctx = createContext({ userAddress: "0xuser" });
194
- await callGetDocument(ctx, "child-doc");
195
- const parentIds = await capturedGetParentsFn("child-doc");
196
- expect(parentIds).toEqual([]);
197
- });
198
- });
199
- });
200
- describe("Query: getDocuments", () => {
201
- const callGetDocuments = async (ctx, driveId) => {
202
- const queryResolver = subgraph.resolvers.Query?.TestModel;
203
- const queryObject = queryResolver(null, {}, ctx);
204
- return queryObject.getDocuments({ driveId });
205
- };
206
- describe("Global Role Access", () => {
207
- it("should return all documents for admin", async () => {
208
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
209
- const result = await callGetDocuments(ctx, "drive-1");
210
- expect(result).toHaveLength(1);
211
- expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
212
- });
213
- });
214
- describe("Document Permission Filtering", () => {
215
- beforeEach(() => {
216
- // Setup multiple documents
217
- mockReactor.getDocuments = vi
218
- .fn()
219
- .mockResolvedValue(["doc-1", "doc-2", "doc-3"]);
220
- mockReactor.getDocument = vi
221
- .fn()
222
- .mockImplementation((id) => Promise.resolve(createMockDocument(id, `Doc ${id}`)));
223
- });
224
- it("should filter documents based on permissions when no global access", async () => {
225
- // User can read drive-1 (required), doc-1, and doc-3, but not doc-2
226
- vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (docId) => docId === "drive-1" || docId === "doc-1" || docId === "doc-3");
227
- const ctx = createContext({ userAddress: "0xpartial" });
228
- const result = await callGetDocuments(ctx, "drive-1");
229
- expect(result).toHaveLength(2);
230
- expect(result.map((d) => d.id).sort()).toEqual(["doc-1", "doc-3"]);
231
- });
232
- it("should return empty array when user has no document permissions", async () => {
233
- // User can read drive-1 but no documents inside it
234
- vi.mocked(mockDocumentPermissionService.canRead).mockImplementation(async (docId) => docId === "drive-1");
235
- const ctx = createContext({ userAddress: "0xnopermissions" });
236
- const result = await callGetDocuments(ctx, "drive-1");
237
- expect(result).toHaveLength(0);
238
- });
239
- });
240
- describe("Drive permission check", () => {
241
- it("should check read permission on the drive first", async () => {
242
- vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
243
- const ctx = createContext({ userAddress: "0xunpermitted" });
244
- await expect(callGetDocuments(ctx, "drive-1")).rejects.toThrow("Forbidden");
245
- });
246
- });
247
- });
248
- describe("Mutation: createDocument", () => {
249
- const callCreateDocument = async (ctx, name, driveId) => {
250
- const mutation = subgraph.resolvers.Mutation
251
- ?.TestModel_createDocument;
252
- return mutation(null, { name, driveId }, ctx);
253
- };
254
- describe("Global Admin Access", () => {
255
- it("should allow creation when user is global admin", async () => {
256
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
257
- const result = await callCreateDocument(ctx, "New Doc");
258
- expect(result).toBe("doc-123");
259
- expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
260
- });
261
- });
262
- describe("With driveId", () => {
263
- it("should check write permission on drive when driveId provided", async () => {
264
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
265
- const ctx = createContext({ userAddress: "0xpermitted" });
266
- const result = await callCreateDocument(ctx, "New Doc", "drive-1");
267
- expect(result).toBe("doc-123");
268
- expect(mockDocumentPermissionService.canWrite).toHaveBeenCalledWith("drive-1", "0xpermitted", expect.any(Function));
269
- });
270
- it("should deny creation when user cannot write to drive", async () => {
271
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
272
- const ctx = createContext({ userAddress: "0xunpermitted" });
273
- await expect(callCreateDocument(ctx, "New Doc", "drive-1")).rejects.toThrow("Forbidden");
274
- });
275
- });
276
- describe("Without driveId", () => {
277
- it("should check global write access when no driveId", async () => {
278
- const ctx = createContext({ userAddress: "0xnoglobal" });
279
- await expect(callCreateDocument(ctx, "New Doc")).rejects.toThrow("Forbidden: insufficient permissions to create documents");
280
- });
281
- });
282
- });
283
- describe("Mutation: operations (setName, setValue, etc.)", () => {
284
- const callMutation = async (ctx, operationName, docId, input) => {
285
- const mutation = subgraph.resolvers.Mutation?.[`TestModel_${operationName}`];
286
- return mutation(null, { docId, input }, ctx);
287
- };
288
- describe("Write Permission Check", () => {
289
- it("should check write permission before executing operation", async () => {
290
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
291
- const ctx = createContext({ userAddress: "0xpermitted" });
292
- await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
293
- expect(mockDocumentPermissionService.canWrite).toHaveBeenCalledWith("doc-123", "0xpermitted", expect.any(Function));
294
- });
295
- it("should deny operation when user cannot write", async () => {
296
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
297
- const ctx = createContext({ userAddress: "0xunpermitted" });
298
- await expect(callMutation(ctx, "setName", "doc-123", { name: "New Name" })).rejects.toThrow("Forbidden: insufficient permissions to write");
299
- });
300
- it("should allow operation for global admin without permission check", async () => {
301
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
302
- const result = await callMutation(ctx, "setName", "doc-123", {
303
- name: "New Name",
304
- });
305
- expect(result).toBe(1);
306
- expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
307
- });
308
- });
309
- describe("Operation-Level Permission Check", () => {
310
- it("should check operation restriction after write permission", async () => {
311
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
312
- vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(false);
313
- const ctx = createContext({ userAddress: "0xpermitted" });
314
- await callMutation(ctx, "setName", "doc-123", { name: "New Name" });
315
- expect(mockDocumentPermissionService.isOperationRestricted).toHaveBeenCalledWith("doc-123", "SET_NAME");
316
- });
317
- it("should allow operation when not restricted", async () => {
318
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
319
- vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(false);
320
- const ctx = createContext({ userAddress: "0xpermitted" });
321
- const result = await callMutation(ctx, "setName", "doc-123", {
322
- name: "New Name",
323
- });
324
- expect(result).toBe(1);
325
- expect(mockDocumentPermissionService.canExecuteOperation).not.toHaveBeenCalled();
326
- });
327
- it("should check operation permission when operation is restricted", async () => {
328
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
329
- vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
330
- vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(true);
331
- const ctx = createContext({ userAddress: "0xauthorized" });
332
- const result = await callMutation(ctx, "restrictedOp", "doc-123", {
333
- value: 42,
334
- });
335
- expect(result).toBe(1);
336
- expect(mockDocumentPermissionService.canExecuteOperation).toHaveBeenCalledWith("doc-123", "RESTRICTED_OP", "0xauthorized");
337
- });
338
- it("should deny operation when user lacks operation permission", async () => {
339
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
340
- vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
341
- vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(false);
342
- const ctx = createContext({ userAddress: "0xunauthorized" });
343
- await expect(callMutation(ctx, "restrictedOp", "doc-123", { value: 42 })).rejects.toThrow('Forbidden: insufficient permissions to execute operation "RESTRICTED_OP"');
344
- });
345
- it("should skip operation restriction check for global admin", async () => {
346
- vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
347
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
348
- await callMutation(ctx, "restrictedOp", "doc-123", { value: 42 });
349
- expect(mockDocumentPermissionService.isOperationRestricted).not.toHaveBeenCalled();
350
- });
351
- });
352
- describe("Document not found", () => {
353
- it("should throw error when document not found", async () => {
354
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
355
- mockReactor.getDocument = vi.fn().mockResolvedValue(null);
356
- const ctx = createContext({ userAddress: "0xpermitted" });
357
- await expect(callMutation(ctx, "setName", "non-existent", { name: "New Name" })).rejects.toThrow("Document not found");
358
- });
359
- });
360
- });
361
- describe("AUTH_ENABLED=false behavior", () => {
362
- it("should allow all read access when admin role returns true", async () => {
363
- const ctx = createContext({
364
- isAdmin: true,
365
- userAddress: "0xanyone",
366
- });
367
- const queryResolver = subgraph.resolvers.Query?.TestModel;
368
- const queryObject = queryResolver(null, {}, ctx);
369
- const result = await queryObject.getDocument({ docId: "doc-123" });
370
- expect(result).toBeDefined();
371
- expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
372
- });
373
- it("should allow all write access when admin role returns true", async () => {
374
- const ctx = createContext({
375
- isAdmin: true,
376
- userAddress: "0xanyone",
377
- });
378
- const result = await subgraph.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx);
379
- expect(result).toBe(1);
380
- expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
381
- });
382
- });
383
- describe("No Permission Service", () => {
384
- let subgraphWithoutPermService;
385
- beforeEach(() => {
386
- subgraphWithoutPermService = new DocumentModelSubgraphLegacy(mockDocumentModel, {
387
- reactor: mockReactor,
388
- reactorClient: mockReactorClient,
389
- documentPermissionService: undefined,
390
- relationalDb: {},
391
- graphqlManager: {},
392
- syncManager: {},
393
- });
394
- });
395
- it("should deny read access when no permission service and no global access", async () => {
396
- const ctx = createContext({ userAddress: "0xuser" });
397
- const queryResolver = subgraphWithoutPermService.resolvers.Query
398
- ?.TestModel;
399
- const queryObject = queryResolver(null, {}, ctx);
400
- await expect(queryObject.getDocument({ docId: "doc-123" })).rejects.toThrow("Forbidden");
401
- });
402
- it("should deny write access when no permission service and no global access", async () => {
403
- const ctx = createContext({ userAddress: "0xuser" });
404
- await expect(subgraphWithoutPermService.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx)).rejects.toThrow("Forbidden");
405
- });
406
- it("should allow access with global roles even without permission service", async () => {
407
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
408
- const queryResolver = subgraphWithoutPermService.resolvers.Query
409
- ?.TestModel;
410
- const queryObject = queryResolver(null, {}, ctx);
411
- const result = await queryObject.getDocument({ docId: "doc-123" });
412
- expect(result).toBeDefined();
413
- });
414
- it("should skip operation restriction check when no permission service", async () => {
415
- const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
416
- const result = await subgraphWithoutPermService.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx);
417
- expect(result).toBe(1);
418
- });
419
- });
420
- describe("Edge Cases", () => {
421
- it("should handle empty user address in context", async () => {
422
- const ctx = {
423
- user: { address: "" },
424
- isAdmin: vi.fn().mockReturnValue(false),
425
- };
426
- const queryResolver = subgraph.resolvers.Query?.TestModel;
427
- const queryObject = queryResolver(null, {}, ctx);
428
- await expect(queryObject.getDocument({ docId: "doc-123" })).rejects.toThrow("Forbidden");
429
- expect(ctx.isAdmin).toHaveBeenCalledWith("");
430
- });
431
- it("should pass correct operation type name to permission check", async () => {
432
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
433
- vi.mocked(mockDocumentPermissionService.isOperationRestricted).mockResolvedValue(true);
434
- vi.mocked(mockDocumentPermissionService.canExecuteOperation).mockResolvedValue(true);
435
- const ctx = createContext({ userAddress: "0xuser" });
436
- await subgraph.resolvers.Mutation?.TestModel_setValue(null, { docId: "doc-123", input: { value: 42 } }, ctx);
437
- expect(mockDocumentPermissionService.isOperationRestricted).toHaveBeenCalledWith("doc-123", "SET_VALUE");
438
- });
439
- it("should handle action error in mutation", async () => {
440
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
441
- mockReactor.addAction = vi.fn().mockResolvedValue({
442
- status: "ERROR",
443
- error: { message: "Action failed" },
444
- operations: [],
445
- });
446
- const ctx = createContext({ userAddress: "0xuser" });
447
- await expect(subgraph.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx)).rejects.toThrow("Action failed");
448
- });
449
- it("should handle operation error in mutation result", async () => {
450
- vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
451
- mockReactor.addAction = vi.fn().mockResolvedValue({
452
- status: "SUCCESS",
453
- operations: [{ index: 1, error: "Validation failed" }],
454
- });
455
- const ctx = createContext({ userAddress: "0xuser" });
456
- await expect(subgraph.resolvers.Mutation?.TestModel_setName(null, { docId: "doc-123", input: { name: "New" } }, ctx)).rejects.toThrow("Validation failed");
457
- });
458
- });
459
- });
460
- //# sourceMappingURL=document-model-subgraph-legacy-permissions.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-model-subgraph-legacy-permissions.test.js","sourceRoot":"","sources":["../../test/document-model-subgraph-legacy-permissions.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=document-model-subgraph.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-model-subgraph.test.d.ts","sourceRoot":"","sources":["../../test/document-model-subgraph.test.ts"],"names":[],"mappings":""}