import { randomUUID } from "node:crypto"; import { redirect } from "next/navigation"; import { auth } from "@/app/(auth)/auth"; import { db } from "@/lib/db"; import { canvasProject } from "@/lib/db/schema"; import { and, desc, eq } from "drizzle-orm"; export const dynamic = "force-dynamic"; type CanvasRedirectPageProps = { searchParams?: Promise>; }; function getSearchParam( params: Record, key: string ) { const value = params[key]; return Array.isArray(value) ? value[0] : value; } function buildCanvasUrl( canvasId: string, params: Record ) { const query = new URLSearchParams(); for (const [key, value] of Object.entries(params)) { if (key === "new" || value === undefined) { continue; } if (Array.isArray(value)) { value.forEach((item) => query.append(key, item)); continue; } query.set(key, value); } const queryString = query.toString(); return `/canvas/${canvasId}${queryString ? `?${queryString}` : ""}`; } async function getLatestCanvasId(userId: string) { const [latestProject] = await db .select({ id: canvasProject.id }) .from(canvasProject) .where( and( eq(canvasProject.userId, userId), eq(canvasProject.workspaceType, "canvas") ) ) .orderBy(desc(canvasProject.updatedAt)) .limit(1); return latestProject?.id || null; } export default async function CanvasRedirectPage({ searchParams, }: CanvasRedirectPageProps) { const params = (await searchParams) || {}; const shouldCreateNew = getSearchParam(params, "new") === "1"; if (shouldCreateNew) { redirect(buildCanvasUrl(randomUUID(), params)); } const session = await auth(); const latestCanvasId = session?.user?.id ? await getLatestCanvasId(session.user.id).catch(() => null) : null; redirect(buildCanvasUrl(latestCanvasId || randomUUID(), params)); }