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"; type VideoCanvasRedirectPageProps = { searchParams?: Promise>; }; function getSearchParam( params: Record, key: string ) { const value = params[key]; return Array.isArray(value) ? value[0] : value; } function buildVideoCanvasUrl( canvasId: string, params: Record ) { const query = new URLSearchParams(); query.set("mode", "video"); query.set("workspaceType", "video"); for (const [key, value] of Object.entries(params)) { if ( key === "new" || key === "mode" || key === "workspaceType" || value === undefined ) { continue; } if (Array.isArray(value)) { value.forEach((item) => query.append(key, item)); continue; } query.set(key, value); } return `/canvas/${canvasId}?${query.toString()}`; } async function getLatestVideoCanvasId(userId: string) { const [latestProject] = await db .select({ id: canvasProject.id }) .from(canvasProject) .where( and( eq(canvasProject.userId, userId), eq(canvasProject.workspaceType, "video") ) ) .orderBy(desc(canvasProject.updatedAt)) .limit(1); return latestProject?.id || null; } export default async function VideoCanvasRedirectPage({ searchParams, }: VideoCanvasRedirectPageProps) { const params = (await searchParams) || {}; const shouldCreateNew = getSearchParam(params, "new") === "1"; if (shouldCreateNew) { redirect(buildVideoCanvasUrl(randomUUID(), params)); } const session = await auth(); const latestCanvasId = session?.user?.id ? await getLatestVideoCanvasId(session.user.id).catch(() => null) : null; redirect(buildVideoCanvasUrl(latestCanvasId || randomUUID(), params)); }