jazz-tools 0.13.4 → 0.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -5
- package/CHANGELOG.md +20 -0
- package/LICENSE.txt +1 -1
- package/dist/{chunk-JNC2UVYB.js → chunk-VQWUJIL4.js} +21 -9
- package/dist/chunk-VQWUJIL4.js.map +1 -0
- package/dist/coValues/account.d.ts.map +1 -1
- package/dist/coValues/group.d.ts +1 -1
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/inbox.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/testing.js +1 -1
- package/dist/tests/patterns/requestToJoin.test.d.ts +2 -0
- package/dist/tests/patterns/requestToJoin.test.d.ts.map +1 -0
- package/package.json +4 -4
- package/src/coValues/account.ts +5 -1
- package/src/coValues/group.ts +1 -1
- package/src/coValues/inbox.ts +26 -12
- package/src/tests/ContextManager.test.ts +1 -1
- package/src/tests/groupsAndAccounts.test.ts +7 -6
- package/src/tests/inbox.test.ts +57 -1
- package/src/tests/patterns/requestToJoin.test.ts +269 -0
- package/tsconfig.json +1 -1
- package/dist/chunk-JNC2UVYB.js.map +0 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/coValues/account.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/coValues/account.ts"],"names":[],"mappings":"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"}
|
package/dist/coValues/group.d.ts
CHANGED
@@ -31,7 +31,7 @@ export declare class Group extends CoValueBase implements CoValue {
|
|
31
31
|
owner: Account;
|
32
32
|
} | Account): G;
|
33
33
|
myRole(): Role | undefined;
|
34
|
-
addMember(member: Everyone, role: "writer" | "reader"): void;
|
34
|
+
addMember(member: Everyone, role: "writer" | "reader" | "writeOnly"): void;
|
35
35
|
addMember(member: Account, role: AccountRole): void;
|
36
36
|
removeMember(member: Everyone | Account): Promise<void>;
|
37
37
|
get members(): Array<{
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/coValues/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,IAAI,EACL,MAAM,QAAQ,CAAC;AAEhB,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,EAAE,EAEF,aAAa,EACb,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,wBAAwB,EAEzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,WAAW,EACX,GAAG,EAQJ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,uCAAuC;AACvC,qBAAa,KAAM,SAAQ,WAAY,YAAW,OAAO;IAC/C,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IAIf,IAAI,EAAE,QAAQ,CAAC;IAGvB,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;IACpB,IAAI,OAAO,IAAI;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAEA;IAYO,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IAE3B,IAAI,KAAK,IAAI;QACX,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;QAClC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;KAC9B,CA2BA;IAED,8DAA8D;gBAClD,OAAO,EAAE;QAAE,OAAO,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,OAAO,GAAG,KAAK,CAAA;KAAE;IA4BvE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,KAAK,EAC3B,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO;IAKxC,MAAM,IAAI,IAAI,GAAG,SAAS;IAI1B,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI;
|
1
|
+
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/coValues/group.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/coValues/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,QAAQ,EAER,SAAS,EACV,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAgB,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEnD,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAe,MAAM,iBAAiB,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,YAAY,EAAE,CAAC;AACpE,KAAK,KAAK,GAAG,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;AAEtC,KAAK,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACpE,KAAK,oBAAoB,GAAG,WAAW,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;CACzC,CAAC,CAAC;AACH,KAAK,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7B,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnC,UAAU,EAAE,WAAW,CAAC;CACzB,CAAC,CAAC;AAEH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO;;;EAyB/C;AAED,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,OAAO,GAAG,SAAS,IAAI,QAAQ,CAAC;IAC7E,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC,CAAC;
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/coValues/inbox.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/testing.js
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"requestToJoin.test.d.ts","sourceRoot":"","sources":["../../../src/tests/patterns/requestToJoin.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
@@ -17,16 +17,16 @@
|
|
17
17
|
},
|
18
18
|
"type": "module",
|
19
19
|
"license": "MIT",
|
20
|
-
"version": "0.13.
|
20
|
+
"version": "0.13.7",
|
21
21
|
"dependencies": {
|
22
22
|
"@scure/bip39": "^1.3.0",
|
23
23
|
"fast-myers-diff": "^3.2.0",
|
24
|
-
"cojson": "0.13.
|
24
|
+
"cojson": "0.13.7"
|
25
25
|
},
|
26
26
|
"devDependencies": {
|
27
27
|
"tsup": "8.3.5",
|
28
|
-
"typescript": "
|
29
|
-
"vitest": "3.
|
28
|
+
"typescript": "5.6.2",
|
29
|
+
"vitest": "3.1.1",
|
30
30
|
"ws": "^8.14.2"
|
31
31
|
},
|
32
32
|
"madge": {
|
package/src/coValues/account.ts
CHANGED
@@ -288,11 +288,15 @@ export class Account extends CoValueBase implements CoValue {
|
|
288
288
|
|
289
289
|
as._raw.core.node.syncManager.addPeer(connectedPeers[1]);
|
290
290
|
|
291
|
-
|
291
|
+
const account = await this.create<A>({
|
292
292
|
creationProps: options.creationProps,
|
293
293
|
crypto: as._raw.core.node.crypto,
|
294
294
|
peersToLoadFrom: [connectedPeers[0]],
|
295
295
|
});
|
296
|
+
|
297
|
+
await account.waitForAllCoValuesSync();
|
298
|
+
|
299
|
+
return account;
|
296
300
|
}
|
297
301
|
|
298
302
|
static fromNode<A extends Account>(
|
package/src/coValues/group.ts
CHANGED
@@ -140,7 +140,7 @@ export class Group extends CoValueBase implements CoValue {
|
|
140
140
|
return this._raw.myRole();
|
141
141
|
}
|
142
142
|
|
143
|
-
addMember(member: Everyone, role: "writer" | "reader"): void;
|
143
|
+
addMember(member: Everyone, role: "writer" | "reader" | "writeOnly"): void;
|
144
144
|
addMember(member: Account, role: AccountRole): void;
|
145
145
|
addMember(member: Everyone | Account, role: AccountRole) {
|
146
146
|
this._raw.addMember(member === "everyone" ? member : member._raw, role);
|
package/src/coValues/inbox.ts
CHANGED
@@ -61,10 +61,10 @@ type InboxMessage<I extends CoValue, O extends CoValue | undefined> = RawCoMap<{
|
|
61
61
|
error: string | undefined;
|
62
62
|
}>;
|
63
63
|
|
64
|
-
function createInboxMessage<
|
65
|
-
|
66
|
-
|
67
|
-
) {
|
64
|
+
async function createInboxMessage<
|
65
|
+
I extends CoValue,
|
66
|
+
O extends CoValue | undefined,
|
67
|
+
>(payload: I, inboxOwner: RawAccount) {
|
68
68
|
const group = payload._raw.group;
|
69
69
|
|
70
70
|
if (group instanceof RawAccount) {
|
@@ -80,6 +80,9 @@ function createInboxMessage<I extends CoValue, O extends CoValue | undefined>(
|
|
80
80
|
error: undefined,
|
81
81
|
});
|
82
82
|
|
83
|
+
await payload._raw.core.waitForSync();
|
84
|
+
await message.core.waitForSync();
|
85
|
+
|
83
86
|
return message;
|
84
87
|
}
|
85
88
|
|
@@ -202,14 +205,18 @@ export class Inbox {
|
|
202
205
|
const stringifiedError = String(error);
|
203
206
|
errors.push(stringifiedError);
|
204
207
|
|
205
|
-
|
206
|
-
.expectCoValueLoaded(item.value)
|
207
|
-
.getCurrentContent() as RawCoMap;
|
208
|
+
let inboxMessage: RawCoMap | undefined;
|
208
209
|
|
209
|
-
|
210
|
+
try {
|
211
|
+
inboxMessage = node
|
212
|
+
.expectCoValueLoaded(item.value)
|
213
|
+
.getCurrentContent() as RawCoMap;
|
214
|
+
|
215
|
+
inboxMessage.set("error", stringifiedError);
|
216
|
+
} catch (error) {}
|
210
217
|
|
211
218
|
if (errors.length > retries) {
|
212
|
-
inboxMessage
|
219
|
+
inboxMessage?.set("processed", true);
|
213
220
|
this.processed.push(txKey);
|
214
221
|
this.failed.push({ errors, value: item.value });
|
215
222
|
} else {
|
@@ -227,7 +234,12 @@ export class Inbox {
|
|
227
234
|
}
|
228
235
|
};
|
229
236
|
|
230
|
-
|
237
|
+
const unsubscribe = this.messages.subscribe(handleNewMessages);
|
238
|
+
|
239
|
+
return () => {
|
240
|
+
unsubscribe();
|
241
|
+
clearFailTimer();
|
242
|
+
};
|
231
243
|
}
|
232
244
|
|
233
245
|
static async load(account: Account) {
|
@@ -286,8 +298,10 @@ export class InboxSender<I extends CoValue, O extends CoValue | undefined> {
|
|
286
298
|
return this.owner;
|
287
299
|
}
|
288
300
|
|
289
|
-
sendMessage(
|
290
|
-
|
301
|
+
async sendMessage(
|
302
|
+
message: I,
|
303
|
+
): Promise<O extends CoValue ? ID<O> : undefined> {
|
304
|
+
const inboxMessage = await createInboxMessage<I, O>(message, this.owner);
|
291
305
|
|
292
306
|
this.messages.push(inboxMessage.id);
|
293
307
|
|
@@ -225,7 +225,7 @@ describe("ContextManager", () => {
|
|
225
225
|
expect(onAnonymousAccountDiscarded).not.toHaveBeenCalled();
|
226
226
|
});
|
227
227
|
|
228
|
-
test("the migration should be applied correctly on existing accounts
|
228
|
+
test("the migration should be applied correctly on existing accounts", async () => {
|
229
229
|
class AccountRoot extends CoMap {
|
230
230
|
value = co.string;
|
231
231
|
}
|
@@ -116,7 +116,7 @@ describe("Group inheritance", () => {
|
|
116
116
|
const mapAsReaderAfterUpdate = await TestMap.load(mapInChild.id, {
|
117
117
|
loadAs: reader,
|
118
118
|
});
|
119
|
-
expect(mapAsReaderAfterUpdate
|
119
|
+
expect(mapAsReaderAfterUpdate).toBe(null);
|
120
120
|
});
|
121
121
|
|
122
122
|
test("Group inheritance with grand-children", async () => {
|
@@ -150,12 +150,14 @@ describe("Group inheritance", () => {
|
|
150
150
|
|
151
151
|
await grandParentGroup.removeMember(reader);
|
152
152
|
|
153
|
+
await grandParentGroup.waitForSync();
|
154
|
+
|
153
155
|
mapInGrandChild.title = "In Grand Child (updated)";
|
154
156
|
|
155
157
|
const mapAsReaderAfterUpdate = await TestMap.load(mapInGrandChild.id, {
|
156
158
|
loadAs: reader,
|
157
159
|
});
|
158
|
-
expect(mapAsReaderAfterUpdate
|
160
|
+
expect(mapAsReaderAfterUpdate).toBe(null);
|
159
161
|
});
|
160
162
|
|
161
163
|
test("Group.getParentGroups should return the parent groups", async () => {
|
@@ -209,7 +211,7 @@ describe("Group inheritance", () => {
|
|
209
211
|
expect(loadedGroup).not.toBe("unavailable");
|
210
212
|
});
|
211
213
|
|
212
|
-
test("everyone is valid only for reader and
|
214
|
+
test("everyone is valid only for reader, writer and writeOnly roles", () => {
|
213
215
|
const group = Group.create();
|
214
216
|
group.addMember("everyone", "reader");
|
215
217
|
|
@@ -224,10 +226,9 @@ describe("Group inheritance", () => {
|
|
224
226
|
|
225
227
|
expect(group.getRoleOf("everyone")).toBe("writer");
|
226
228
|
|
227
|
-
|
228
|
-
expect(() => group.addMember("everyone", "writeOnly")).toThrow();
|
229
|
+
group.addMember("everyone", "writeOnly");
|
229
230
|
|
230
|
-
expect(group.getRoleOf("everyone")).toBe("
|
231
|
+
expect(group.getRoleOf("everyone")).toBe("writeOnly");
|
231
232
|
});
|
232
233
|
|
233
234
|
test("typescript should show an error when adding a member with a non-account role", async () => {
|
package/src/tests/inbox.test.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
2
2
|
import { Account } from "../coValues/account";
|
3
3
|
import { CoMap } from "../coValues/coMap";
|
4
4
|
import { Group } from "../coValues/group";
|
@@ -191,6 +191,8 @@ describe("Inbox", () => {
|
|
191
191
|
},
|
192
192
|
);
|
193
193
|
|
194
|
+
const errorLogSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
195
|
+
|
194
196
|
const unsubscribe = receiverInbox.subscribe(Message, async () => {
|
195
197
|
return Promise.reject(new Error("Failed"));
|
196
198
|
});
|
@@ -203,6 +205,13 @@ describe("Inbox", () => {
|
|
203
205
|
);
|
204
206
|
|
205
207
|
unsubscribe();
|
208
|
+
|
209
|
+
expect(errorLogSpy).toHaveBeenCalledWith(
|
210
|
+
"Error processing inbox message",
|
211
|
+
expect.any(Error),
|
212
|
+
);
|
213
|
+
|
214
|
+
errorLogSpy.mockRestore();
|
206
215
|
});
|
207
216
|
|
208
217
|
it("should mark messages as processed", async () => {
|
@@ -297,6 +306,7 @@ describe("Inbox", () => {
|
|
297
306
|
owner: Group.create({ owner: sender }),
|
298
307
|
},
|
299
308
|
);
|
309
|
+
const errorLogSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
300
310
|
|
301
311
|
// Setup inbox sender
|
302
312
|
const inboxSender = await InboxSender.load(receiver.id, sender);
|
@@ -319,5 +329,51 @@ describe("Inbox", () => {
|
|
319
329
|
const [failed] = Object.values(receiverInbox.failed.items).flat();
|
320
330
|
expect(failed?.value.errors.length).toBe(3);
|
321
331
|
unsubscribe();
|
332
|
+
|
333
|
+
expect(errorLogSpy).toHaveBeenCalledWith(
|
334
|
+
"Error processing inbox message",
|
335
|
+
expect.any(Error),
|
336
|
+
);
|
337
|
+
|
338
|
+
errorLogSpy.mockRestore();
|
339
|
+
});
|
340
|
+
|
341
|
+
it("should not break the subscription if the message is unavailable", async () => {
|
342
|
+
const { clientAccount: sender, serverAccount: receiver } =
|
343
|
+
await setupTwoNodes();
|
344
|
+
|
345
|
+
const receiverInbox = await Inbox.load(receiver);
|
346
|
+
|
347
|
+
const inboxSender = await InboxSender.load(receiver.id, sender);
|
348
|
+
inboxSender.messages.push(`co_z123234` as any);
|
349
|
+
|
350
|
+
const spy = vi.fn();
|
351
|
+
|
352
|
+
const errorLogSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
353
|
+
|
354
|
+
// Subscribe to inbox messages
|
355
|
+
const unsubscribe = receiverInbox.subscribe(
|
356
|
+
Message,
|
357
|
+
async () => {
|
358
|
+
spy();
|
359
|
+
},
|
360
|
+
{ retries: 2 },
|
361
|
+
);
|
362
|
+
|
363
|
+
await waitFor(() => {
|
364
|
+
const [failed] = Object.values(receiverInbox.failed.items).flat();
|
365
|
+
|
366
|
+
expect(failed?.value.errors.length).toBe(3);
|
367
|
+
});
|
368
|
+
|
369
|
+
expect(spy).not.toHaveBeenCalled();
|
370
|
+
unsubscribe();
|
371
|
+
|
372
|
+
expect(errorLogSpy).toHaveBeenCalledWith(
|
373
|
+
"Error processing inbox message",
|
374
|
+
expect.any(Error),
|
375
|
+
);
|
376
|
+
|
377
|
+
errorLogSpy.mockRestore();
|
322
378
|
});
|
323
379
|
});
|
@@ -0,0 +1,269 @@
|
|
1
|
+
import { assert, describe, expect, test } from "vitest";
|
2
|
+
import { Account, CoList, CoMap, Group, ID, co } from "../../exports";
|
3
|
+
import { createJazzTestAccount, linkAccounts } from "../../testing";
|
4
|
+
|
5
|
+
class RequestToJoin extends CoMap {
|
6
|
+
account = co.ref(Account);
|
7
|
+
status = co.literal("pending", "approved", "rejected");
|
8
|
+
}
|
9
|
+
|
10
|
+
class ProjectsList extends CoList.Of(co.string) {}
|
11
|
+
|
12
|
+
class RequestsMap extends CoMap.Record(co.ref(RequestToJoin)) {}
|
13
|
+
|
14
|
+
class RequestsStatus extends CoMap.Record(
|
15
|
+
co.literal("pending", "approved", "rejected"),
|
16
|
+
) {}
|
17
|
+
|
18
|
+
class Organization extends CoMap {
|
19
|
+
name = co.string;
|
20
|
+
requests = co.ref(RequestsMap);
|
21
|
+
statuses = co.ref(RequestsStatus);
|
22
|
+
projects = co.ref(ProjectsList);
|
23
|
+
mainGroup = co.ref(Group);
|
24
|
+
}
|
25
|
+
|
26
|
+
async function setup() {
|
27
|
+
const admin1 = await createJazzTestAccount();
|
28
|
+
const admin2 = await createJazzTestAccount();
|
29
|
+
const user1 = await createJazzTestAccount();
|
30
|
+
const user2 = await createJazzTestAccount();
|
31
|
+
|
32
|
+
await linkAccounts(admin1, admin2);
|
33
|
+
await linkAccounts(admin1, user1);
|
34
|
+
await linkAccounts(admin1, user2);
|
35
|
+
await linkAccounts(admin2, user1);
|
36
|
+
await linkAccounts(admin2, user2);
|
37
|
+
|
38
|
+
// The organization info are public
|
39
|
+
const adminsGroup = Group.create(admin1);
|
40
|
+
adminsGroup.addMember(admin2, "admin");
|
41
|
+
|
42
|
+
const publicGroup = Group.create(admin1);
|
43
|
+
publicGroup.addMember("everyone", "reader");
|
44
|
+
publicGroup.extend(adminsGroup);
|
45
|
+
|
46
|
+
// Everyone can write to requests, but only admins can read
|
47
|
+
const requestsGroup = Group.create(admin1);
|
48
|
+
requestsGroup.addMember("everyone", "writeOnly");
|
49
|
+
requestsGroup.extend(adminsGroup);
|
50
|
+
|
51
|
+
const organizationGroup = Group.create(admin1);
|
52
|
+
organizationGroup.extend(adminsGroup);
|
53
|
+
|
54
|
+
const organization = Organization.create(
|
55
|
+
{
|
56
|
+
name: "My Organization",
|
57
|
+
requests: RequestsMap.create({}, requestsGroup),
|
58
|
+
|
59
|
+
// To simulate the resource to share
|
60
|
+
projects: ProjectsList.create([], organizationGroup),
|
61
|
+
|
62
|
+
// Statuses are private to admins
|
63
|
+
// Used to make the requests statues readable only to them
|
64
|
+
// and not editable by anyone else
|
65
|
+
// The status info inside RequestToJoin is only used to notify the user of the status change
|
66
|
+
// but this is the source of truth for admins
|
67
|
+
statuses: RequestsStatus.create({}, adminsGroup),
|
68
|
+
mainGroup: organizationGroup,
|
69
|
+
},
|
70
|
+
publicGroup,
|
71
|
+
);
|
72
|
+
|
73
|
+
const organizationId = organization.id;
|
74
|
+
|
75
|
+
return {
|
76
|
+
admin1,
|
77
|
+
admin2,
|
78
|
+
user1,
|
79
|
+
user2,
|
80
|
+
organizationId,
|
81
|
+
};
|
82
|
+
}
|
83
|
+
|
84
|
+
async function sendRequestToJoin(
|
85
|
+
organizationId: ID<Organization>,
|
86
|
+
account: Account,
|
87
|
+
) {
|
88
|
+
const organization = await Organization.load(organizationId, {
|
89
|
+
resolve: { requests: true },
|
90
|
+
loadAs: account,
|
91
|
+
});
|
92
|
+
|
93
|
+
if (!organization) {
|
94
|
+
throw new Error("RequestsMap not found");
|
95
|
+
}
|
96
|
+
|
97
|
+
const request = RequestToJoin.create(
|
98
|
+
{
|
99
|
+
account,
|
100
|
+
status: "pending",
|
101
|
+
},
|
102
|
+
organization.requests._owner,
|
103
|
+
);
|
104
|
+
|
105
|
+
organization.requests[account.id] = request;
|
106
|
+
|
107
|
+
await account.waitForAllCoValuesSync();
|
108
|
+
|
109
|
+
return request;
|
110
|
+
}
|
111
|
+
|
112
|
+
async function approveRequest(
|
113
|
+
organizationId: ID<Organization>,
|
114
|
+
admin: Account,
|
115
|
+
user: Account,
|
116
|
+
) {
|
117
|
+
const organization = await Organization.load(organizationId, {
|
118
|
+
loadAs: admin,
|
119
|
+
resolve: { statuses: true, requests: { $each: true }, mainGroup: true },
|
120
|
+
});
|
121
|
+
|
122
|
+
if (!organization) {
|
123
|
+
throw new Error("Organization not found");
|
124
|
+
}
|
125
|
+
|
126
|
+
const request = organization.requests[user.id];
|
127
|
+
|
128
|
+
if (
|
129
|
+
organization.statuses[user.id] === "approved" ||
|
130
|
+
organization.statuses[user.id] === "rejected"
|
131
|
+
) {
|
132
|
+
throw new Error("Request already processed");
|
133
|
+
}
|
134
|
+
|
135
|
+
if (!request) {
|
136
|
+
throw new Error("Request not found");
|
137
|
+
}
|
138
|
+
|
139
|
+
request.status = "approved";
|
140
|
+
organization.statuses[user.id] = "approved";
|
141
|
+
|
142
|
+
organization.mainGroup.addMember(user, "writer");
|
143
|
+
|
144
|
+
await admin.waitForAllCoValuesSync();
|
145
|
+
}
|
146
|
+
|
147
|
+
async function rejectRequest(
|
148
|
+
organizationId: ID<Organization>,
|
149
|
+
admin: Account,
|
150
|
+
user: Account,
|
151
|
+
) {
|
152
|
+
const organization = await Organization.load(organizationId, {
|
153
|
+
loadAs: admin,
|
154
|
+
resolve: { statuses: true, requests: { $each: true } },
|
155
|
+
});
|
156
|
+
|
157
|
+
if (!organization) {
|
158
|
+
throw new Error("Organization not found");
|
159
|
+
}
|
160
|
+
|
161
|
+
const request = organization.requests[user.id];
|
162
|
+
|
163
|
+
if (
|
164
|
+
organization.statuses[user.id] === "approved" ||
|
165
|
+
organization.statuses[user.id] === "rejected"
|
166
|
+
) {
|
167
|
+
throw new Error("Request already processed");
|
168
|
+
}
|
169
|
+
|
170
|
+
if (!request) {
|
171
|
+
throw new Error("Request not found");
|
172
|
+
}
|
173
|
+
|
174
|
+
request.status = "rejected";
|
175
|
+
organization.statuses[user.id] = "rejected";
|
176
|
+
|
177
|
+
await admin.waitForAllCoValuesSync();
|
178
|
+
}
|
179
|
+
|
180
|
+
describe("Request to join", () => {
|
181
|
+
test("accepting a request gives access to the projects", async () => {
|
182
|
+
const { admin1, user1, organizationId } = await setup();
|
183
|
+
|
184
|
+
const organization = await Organization.load(organizationId, {
|
185
|
+
loadAs: admin1,
|
186
|
+
resolve: {
|
187
|
+
requests: { $each: true },
|
188
|
+
statuses: { $each: true },
|
189
|
+
projects: true,
|
190
|
+
},
|
191
|
+
});
|
192
|
+
|
193
|
+
assert(organization);
|
194
|
+
|
195
|
+
await sendRequestToJoin(organizationId, user1);
|
196
|
+
|
197
|
+
await approveRequest(organizationId, admin1, user1);
|
198
|
+
|
199
|
+
const projectsOnUser = await ProjectsList.load(organization.projects.id, {
|
200
|
+
loadAs: user1,
|
201
|
+
});
|
202
|
+
|
203
|
+
assert(projectsOnUser);
|
204
|
+
|
205
|
+
projectsOnUser.push("project1");
|
206
|
+
|
207
|
+
expect(projectsOnUser[0]).toBe("project1");
|
208
|
+
});
|
209
|
+
|
210
|
+
test("rejecting a request does not give access to the projects", async () => {
|
211
|
+
const { admin1, user1, organizationId } = await setup();
|
212
|
+
|
213
|
+
const organization = await Organization.load(organizationId, {
|
214
|
+
loadAs: admin1,
|
215
|
+
resolve: {
|
216
|
+
requests: { $each: true },
|
217
|
+
statuses: { $each: true },
|
218
|
+
projects: true,
|
219
|
+
},
|
220
|
+
});
|
221
|
+
|
222
|
+
assert(organization);
|
223
|
+
|
224
|
+
await sendRequestToJoin(organizationId, user1);
|
225
|
+
await rejectRequest(organizationId, admin1, user1);
|
226
|
+
|
227
|
+
const projectsOnUser = await ProjectsList.load(organization.projects.id, {
|
228
|
+
loadAs: user1,
|
229
|
+
});
|
230
|
+
|
231
|
+
expect(projectsOnUser).toBeNull();
|
232
|
+
});
|
233
|
+
|
234
|
+
test("admin2 can see the status of the requests", async () => {
|
235
|
+
const { admin1, admin2, user1, organizationId } = await setup();
|
236
|
+
|
237
|
+
const request = await sendRequestToJoin(organizationId, user1);
|
238
|
+
await approveRequest(organizationId, admin1, user1);
|
239
|
+
|
240
|
+
const organization = await Organization.load(organizationId, {
|
241
|
+
loadAs: admin2,
|
242
|
+
resolve: { requests: { $each: true }, statuses: { $each: true } },
|
243
|
+
});
|
244
|
+
|
245
|
+
assert(organization);
|
246
|
+
expect(organization.statuses[user1.id]).toBe("approved");
|
247
|
+
const requestOnAdmin2 = await RequestToJoin.load(request.id, {
|
248
|
+
loadAs: admin2,
|
249
|
+
});
|
250
|
+
assert(requestOnAdmin2);
|
251
|
+
expect(requestOnAdmin2.status).toBe("approved");
|
252
|
+
});
|
253
|
+
|
254
|
+
test("user2 can't see the requests of user1", async () => {
|
255
|
+
const { user1, user2, organizationId } = await setup();
|
256
|
+
|
257
|
+
const request = await sendRequestToJoin(organizationId, user1);
|
258
|
+
|
259
|
+
const requestOnUser2 = await RequestToJoin.load(request.id, {
|
260
|
+
loadAs: user2,
|
261
|
+
});
|
262
|
+
|
263
|
+
// With the writeOnly permission, the user can download the request
|
264
|
+
// but not it's content
|
265
|
+
assert(requestOnUser2);
|
266
|
+
expect(requestOnUser2.status).toBe(undefined);
|
267
|
+
expect(requestOnUser2.account).toBe(undefined);
|
268
|
+
});
|
269
|
+
});
|