74 lines
2.0 KiB
TypeScript
74 lines
2.0 KiB
TypeScript
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<Record<string, string | string[] | undefined>>;
|
|
};
|
|
|
|
function getSearchParam(
|
|
params: Record<string, string | string[] | undefined>,
|
|
key: string
|
|
) {
|
|
const value = params[key];
|
|
return Array.isArray(value) ? value[0] : value;
|
|
}
|
|
|
|
function buildCanvasUrl(
|
|
canvasId: string,
|
|
params: Record<string, string | string[] | undefined>
|
|
) {
|
|
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));
|
|
}
|