import { NextResponse, type NextRequest } from "next/server"; import { OAC_CASE_COOKIE, parseOacCase } from "@/utils/user"; // บังคับ login (mock e-Court) ทุกหน้า — ไม่มี cookie oacCase ที่ parse ได้ = redirect /login // (parse จริง ไม่ใช่แค่มี cookie — cookie ขยะ/ครึ่ง ๆ ถือว่ายังไม่เข้าสู่ระบบ) export function middleware(req: NextRequest) { const user = parseOacCase(req.cookies.get(OAC_CASE_COOKIE)?.value); if (!user) { const url = req.nextUrl.clone(); // N8 D5: เก็บ path+query ไว้วนกลับหลัง login (deep link จาก e-Court ไม่หาย) // — ไม่ใส่กรณี next เป็น "/" ไปเฉย ๆ ไม่ให้ /note/login มี query เกินจำเป็น // (path ตรงนี้ตัด basePath แล้ว จึงขึ้นต้น /note/… เสมอ / NextURL ใส่ basePath คืนตอน // redirect เอง — invariant #12) const next = url.pathname + url.search; url.pathname = "/note/login"; url.search = ""; if (next !== "/") url.searchParams.set("next", next); return NextResponse.redirect(url); } return NextResponse.next(); } // ยกเว้น: หน้า login เอง, API/SSE/export (อยู่ใต้ api/note/**), API template // (api/template/** — เปิดกว้างให้ทางศาล/ผู้ทดสอบภายนอกยิงได้เลย ไม่แตะ DB // ไม่มีข้อมูลรับ), หน้า Swagger UI (api/swagger — document ของทุกกลุ่ม), // ไฟล์อัปโหลด, Next internal, และ static ใน public/note/ (pdf.worker, samples, // asset Swagger UI) + public/ ราก (fonts, favicon) // — matcher ทำงานบน path หลังตัด basePath (/docedit): หน้า/ไฟล์ของแอปขึ้นต้น note/ // ส่วน API ขึ้นต้น api/note/ (URL /docedit/api/note/…) export const config = { matcher: [ "/((?!note/login|api/note|api/template|api/swagger|note/uploads|note/samples|note/swagger-ui|note/pdf\\.worker\\.min\\.mjs|_next|fonts|favicon\\.ico).*)", ], };