eCourt-note/app/api/template/extract/route.ts

62 lines
2.3 KiB
TypeScript
Raw Normal View History

2026-10-07 10:16:12 +07:00
import { NextResponse } from "next/server";
import { extractDocumentSnapshot } from "@/lib/lib-tmpl";
// export const runtime = "nodejs";
2026-10-07 10:16:12 +07:00
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") ?? "");
2026-10-07 10:16:12 +07:00
if (!(file instanceof File) ||
(file.type !== DOCX_CONTENT_TYPE && !file.name.toLowerCase().endsWith(".docx") )
2026-10-07 10:16:12 +07:00
) {
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());
// ชุดแกะข้อมูล `{cc, bookmark, properties, verify}` จาก lib-tmpl.ts — ตัวเดียวกับที่
// ใช้เก็บเป็น fields ของ version ตอน POST /api/documents/versions (2026-10-30) ·
// secret/public_key เป็นของผู้เรียกเพื่อ "ทดสอบ verify" เฉพาะฝั่งนี้
const returnData = extractDocumentSnapshot(buffer, {
secret: TEST_SECRET || undefined,
publicKeyHex: TEST_PUBLIC_KEY_HEX || undefined,
});
return NextResponse.json(returnData);
2026-10-07 10:16:12 +07:00
} catch (error) {
console.error(error);
return NextResponse.json(
{
error:
error instanceof Error
? error.message
: "Internal Server Error",
},
{ status: 500 },
);
}
}