Skip to content
File

Blob: src/client/stores/db/workspace-lifecycle.ts

typescript78 lines
1import { db } from "./bland-db";
2 
3/**
4 * Cascade-remove a workspace from every local table. Used for leave/delete
5 * flows. Cross-store and transactional: directory + replica + pages +
6 * members + page access (joined via workspacePages primary keys) +
7 * lastVisitedPages + the `lastVisitedWorkspaceId` meta row when it points
8 * at the removed workspace.
9 */
10async function removeWorkspace(workspaceId: string): Promise<void> {
11 await db.transaction(
12 "rw",
13 [
14 db.memberWorkspaces,
15 db.workspaceReplicas,
16 db.workspacePages,
17 db.workspaceMembers,
18 db.pageAccess,
19 db.lastVisitedPages,
20 db.workspaceMeta,
21 ],
22 async () => {
23 const pageIds = (await db.workspacePages.where("workspace_id").equals(workspaceId).primaryKeys()) as string[];
24 
25 await db.memberWorkspaces.delete(workspaceId);
26 await db.workspaceReplicas.delete(workspaceId);
27 await db.workspacePages.bulkDelete(pageIds);
28 await db.workspaceMembers.where("workspace_id").equals(workspaceId).delete();
29 if (pageIds.length > 0) {
30 await db.pageAccess.bulkDelete(pageIds);
31 }
32 await db.lastVisitedPages.delete(workspaceId);
33 const lv = await db.workspaceMeta.get("lastVisitedWorkspaceId");
34 if (lv?.value === workspaceId) {
35 await db.workspaceMeta.put({ key: "lastVisitedWorkspaceId", value: null });
36 }
37 },
38 );
39}
40 
41/**
42 * Clear every local workspace table, preserving the `workspaceMeta` row
43 * structure. The caller is responsible for writing the new `owner` value
44 * after this completes. Used by owner-change and logout flows.
45 */
46async function clearAllLocal(): Promise<void> {
47 await db.transaction(
48 "rw",
49 [
50 db.memberWorkspaces,
51 db.workspaceReplicas,
52 db.workspacePages,
53 db.workspaceMembers,
54 db.pageAccess,
55 db.sharedInboxItems,
56 db.sharedInboxWorkspaceSummaries,
57 db.lastVisitedPages,
58 db.workspaceMeta,
59 ],
60 async () => {
61 await db.memberWorkspaces.clear();
62 await db.workspaceReplicas.clear();
63 await db.workspacePages.clear();
64 await db.workspaceMembers.clear();
65 await db.pageAccess.clear();
66 await db.sharedInboxItems.clear();
67 await db.sharedInboxWorkspaceSummaries.clear();
68 await db.lastVisitedPages.clear();
69 await db.workspaceMeta.put({ key: "lastVisitedWorkspaceId", value: null });
70 },
71 );
72}
73 
74export const workspaceLifecycleCommands = {
75 removeWorkspace,
76 clearAllLocal,
77};