import { NextResponse } from "next/server"; import { extractContentControls, extractBookmark, templateContentControls, setCustomDocProps, getDocProps,templateDynamicContents } from "@/lib/lib-tmpl"; import { verifyEd25519, verifyHmacSha256 } from "@/lib/lib-utils"; // export const runtime = "nodejs"; const DOCX_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; // cap เดียวกับ N4 (app/actions/files.ts) — route นี้เปิดกว้างให้ภายนอกยิงได้ // ต้องเช็คขนาดก่อนอ่านเข้าหน่วยความจำ กัน DoS (bodySizeLimit ครอบเฉพาะ Server Actions) const MAX_UPLOAD_BYTES = 100 * 1024 * 1024; // 100MB export async function POST(request: Request) { try { const formData = await request.formData(); const file = formData.get("file"); const TEST_SECRET = String(formData.get("secret") ?? ""); const TEST_PUBLIC_KEY_HEX = String(formData.get("public_key") ?? ""); if (!(file instanceof File) || (file.type !== DOCX_CONTENT_TYPE && !file.name.toLowerCase().endsWith(".docx") ) ) { return NextResponse.json( { error: 'Field "file" must be a .docx file.', }, { status: 400 }, ); } if (file.size > MAX_UPLOAD_BYTES) { return NextResponse.json( { error: 'Field "file" exceeds the 100MB size limit.', }, { status: 400 }, ); } // File → Buffer const buffer = Buffer.from(await file.arrayBuffer()); // ใช้ lib-tmpl.ts เดิม // const data = extractContentControls(buffer); const cc = extractContentControls(buffer); const bookmark = extractBookmark(buffer) const properties = getDocProps(buffer) let verify: Record ={} const ticket_data = properties?.custom?.ticket_data const HmacSha256 = String(properties?.custom?.HmacSha256) const Ed25519 = String(properties?.custom?.Ed25519) if(ticket_data && typeof ticket_data === 'string'){ const ticketDataObj= JSON.parse(ticket_data) const unix_timestamp = Number(ticketDataObj.exp)*1000 if(unix_timestamp){ verify['exp'] = new Date(unix_timestamp).toLocaleString("th-TH", { timeZone: "Asia/Bangkok" }) } if(TEST_SECRET && HmacSha256){ verify['HmacSha256'] = verifyHmacSha256(ticket_data,TEST_SECRET,HmacSha256) } if(TEST_PUBLIC_KEY_HEX&& Ed25519){ verify["Ed25519"]=verifyEd25519(ticket_data,Ed25519,TEST_PUBLIC_KEY_HEX) } } let returnData : Record = {cc,bookmark,properties,verify} return NextResponse.json(returnData); } catch (error) { console.error(error); return NextResponse.json( { error: error instanceof Error ? error.message : "Internal Server Error", }, { status: 500 }, ); } }