Files
mnote/wolai-frontend/src/lib/server/sidebar-data.ts
T

95 lines
3.0 KiB
TypeScript
Raw Normal View History

2026-04-14 13:22:29 +08:00
import { randomUUID } from "crypto";
import type { ConvexHttpClient } from "convex/browser";
import type { SidebarInitialData } from "@/components/sidebar/types";
import type { DocumentRecord } from "@/lib/documents";
import { api } from "@/lib/convex/api";
import { buildSidebarInitialData } from "@/lib/sidebar-data";
import type { WorkspaceSummary } from "@/lib/workspaces";
type LoadSidebarDataFromConvexInput = {
client: ConvexHttpClient;
userId: string;
fallbackName: string;
requestedWorkspaceId?: string | null;
};
type LoadSidebarDataFromConvexResult = {
workspaces: WorkspaceSummary[];
activeWorkspaceId: string;
targetWorkspaceId: string | null;
sidebarInitialData: SidebarInitialData | null;
documents: DocumentRecord[];
};
export async function loadSidebarDataFromConvex(
input: LoadSidebarDataFromConvexInput,
): Promise<LoadSidebarDataFromConvexResult> {
const bootstrap = await input.client.mutation(api.workspaces.ensureDefaultWorkspace, {
fallbackName: input.fallbackName,
workspaceIdIfCreate: randomUUID(),
});
const summaries = await input.client.query(api.workspaces.fetchWorkspaceSummaries, {});
const workspaces = summaries.workspaces.length > 0 ? summaries.workspaces : bootstrap.workspaces;
const activeWorkspaceId = summaries.activeWorkspaceId || bootstrap.activeWorkspaceId;
const targetWorkspaceId = input.requestedWorkspaceId?.trim() || activeWorkspaceId || null;
if (!targetWorkspaceId) {
return {
workspaces,
activeWorkspaceId,
targetWorkspaceId: null,
sidebarInitialData: null,
documents: [],
};
}
const [documents, trashedDocuments, mindmaps, mediaAssets, trashedMediaAssets, tables] = await Promise.all([
input.client.query(api.documents.listByWorkspace, {
workspaceId: targetWorkspaceId,
}),
input.client.query(api.documents.listTrashedByWorkspace, {
workspaceId: targetWorkspaceId,
}),
input.client.query(api.mindmaps.listByWorkspace, {
workspaceId: targetWorkspaceId,
includeDeleted: true,
}),
input.client.query(api.mediaAssets.listByWorkspace, {
userId: input.userId,
workspaceId: targetWorkspaceId,
limit: 200,
}),
input.client.query(api.mediaAssets.listDeletedByWorkspace, {
userId: input.userId,
workspaceId: targetWorkspaceId,
limit: 2000,
}),
input.client.query(api.tables.listByWorkspaceForSearch, {
userId: input.userId,
workspaceId: targetWorkspaceId,
includeArchived: true,
limit: 3000,
}),
]);
const normalizedDocuments = documents as DocumentRecord[];
return {
workspaces,
activeWorkspaceId,
targetWorkspaceId,
sidebarInitialData: buildSidebarInitialData({
activeWorkspaceId: targetWorkspaceId,
workspaces,
documents: normalizedDocuments,
trashedDocuments,
mindmaps: mindmaps ?? [],
mediaAssets: mediaAssets ?? [],
trashedMediaAssets: trashedMediaAssets ?? [],
tables: tables ?? [],
}),
documents: normalizedDocuments,
};
}