File
Blob: src/client/stores/db/workspace-lifecycle.ts
| 1 | import { 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 | */ |
| 10 | async 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 | */ |
| 46 | async 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 | |
| 74 | export const workspaceLifecycleCommands = { |
| 75 | removeWorkspace, |
| 76 | clearAllLocal, |
| 77 | }; |