95 lines
3.0 KiB
TypeScript
95 lines
3.0 KiB
TypeScript
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,
|
||
|
|
};
|
||
|
|
}
|