import { asc, eq, inArray } from "drizzle-orm"; import { notFound, redirect } from "next/navigation"; import { db } from "@/db"; import { annotationReplies, annotations, bookmarks, files, toAnnotationDTO, toBookmarkDTO, toReplyDTO, } from "@/db/schema"; import PDFViewer from "@/components/pdf/PDFViewer"; import DebugConsole from "@/components/DebugConsole"; // TEMP-DEBUG (ลบพร้อมไฟล์) import { getSessionUser } from "@/lib/session"; const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; export const dynamic = "force-dynamic"; export default async function AnnotatePage({ params, }: { params: { id: string }; }) { const { id } = params; if (!UUID_RE.test(id)) notFound(); // defense ซ้อน middleware — identity จาก cookie oacCase ส่งเข้า viewer ตั้งแต่ first paint const user = getSessionUser(); if (!user) redirect("/note/login"); const [file] = await db.select().from(files).where(eq(files.id, id)); if (!file) notFound(); const [annotationRows, bookmarkRows] = await Promise.all([ db .select() .from(annotations) .where(eq(annotations.fileId, id)) .orderBy(asc(annotations.createdAt)), db .select() .from(bookmarks) .where(eq(bookmarks.fileId, id)) .orderBy(asc(bookmarks.createdAt)), ]); // replies ของทุก comment ในไฟล์นี้ (F9) — แม่ถูก CASCADE ไปแล้ว row ก็หายตาม const annotationIds = annotationRows.map((r) => r.id); const replyRows = annotationIds.length ? await db .select() .from(annotationReplies) .where(inArray(annotationReplies.annotationId, annotationIds)) .orderBy(asc(annotationReplies.createdAt)) : []; return ( <> {/* TEMP-DEBUG: อ่าน log บนจอ iPad ผ่าน Eruda เมื่อเปิดหน้าพร้อม ?debug */} ); }