Refactor document versioning to extract fields from uploaded .docx files on the server side
- Removed the `fields` parameter from the version upload form, as it is now extracted from the uploaded .docx file using the `extractContentControls` function. - Updated related types and interfaces to reflect the new structure of version fields. - Modified the OpenAPI specification to document the changes in the versioning process. - Adjusted tests to ensure compliance with the new behavior, including validation for the absence of the `fields` parameter. - Implemented a new function `extractDocumentSnapshot` to handle the extraction of content controls and document properties from .docx files. - Updated metadata and versioning services to align with the new extraction logic.
This commit is contained in:
parent
bc61f0fd2e
commit
cdae1ceedd
17 changed files with 380 additions and 179 deletions
|
|
@ -7,7 +7,6 @@ import {
|
|||
isDocxBytes,
|
||||
isPdfBytes,
|
||||
parseDownloadFormat,
|
||||
parseFieldsJson,
|
||||
parseVersionIdParam,
|
||||
parseVersionUploadForm,
|
||||
sanitizeDisplayFileName,
|
||||
|
|
@ -71,23 +70,6 @@ describe("isDocxBytes / isPdfBytes", () => {
|
|||
});
|
||||
});
|
||||
|
||||
describe("parseFieldsJson", () => {
|
||||
it("แยก JSON object ล้วนได้ และ `{}` = null (ถือว่าไม่ส่ง)", () => {
|
||||
const result = parseFieldsJson('{"blackno":"คดีหมายเลขดำที่"}');
|
||||
ok(result);
|
||||
expect(result.fields).toEqual({ blackno: "คดีหมายเลขดำที่" });
|
||||
const empty = parseFieldsJson("{}");
|
||||
ok(empty);
|
||||
expect(empty.fields).toBeNull();
|
||||
});
|
||||
|
||||
it("ตกเมื่อ JSON เพี้ยน / ไม่ใช่ object / value ไม่ใช่ string", () => {
|
||||
for (const raw of ["ไม่ใช่ JSON", "[1,2]", '"string"', "null", '{"a":1}']) {
|
||||
expect(parseFieldsJson(raw).ok).toBe(false);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseVersionUploadForm", () => {
|
||||
// identity (userId/userName) กับ templateId ถอดออกจาก form แล้ว — route แกะจาก
|
||||
// Bearer token ผ่าน lib/docver-token.ts (เคสของ token อยู่ docver-token.test.ts)
|
||||
|
|
@ -101,7 +83,6 @@ describe("parseVersionUploadForm", () => {
|
|||
const form = baseForm();
|
||||
form.append("clientVersionId", " 11111111-1111-4111-8111-111111111111 ");
|
||||
form.append("message", " ");
|
||||
form.append("fields", '{"blackno":"1"}');
|
||||
form.append("fileName", "C:\\Users\\judge\\คำสั่งเรียก.docx");
|
||||
const result = parseVersionUploadForm(form);
|
||||
ok(result);
|
||||
|
|
@ -109,7 +90,6 @@ describe("parseVersionUploadForm", () => {
|
|||
clientVersionId: "11111111-1111-4111-8111-111111111111",
|
||||
message: null,
|
||||
fileName: "คำสั่งเรียก.docx",
|
||||
fields: { blackno: "1" },
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -131,6 +111,14 @@ describe("parseVersionUploadForm", () => {
|
|||
}
|
||||
});
|
||||
|
||||
it("ส่ง fields ใน form = 400 (2026-10-30 — server แกะจากไฟล์เองแบบ /api/template/extract)", () => {
|
||||
const form = baseForm();
|
||||
form.append("fields", '{"blackno":"1"}');
|
||||
const result = parseVersionUploadForm(form);
|
||||
expect(result.ok).toBe(false);
|
||||
if (!result.ok) expect(result.error).toContain("fields");
|
||||
});
|
||||
|
||||
it("ตกเมื่อ text field ถูกส่งมาเป็นไฟล์", () => {
|
||||
const form = baseForm();
|
||||
form.append("message", new File(["x"], "m.txt"));
|
||||
|
|
@ -147,31 +135,6 @@ describe("parseVersionUploadForm", () => {
|
|||
over.append("message", "a".repeat(DOCVER_MESSAGE_MAX + 1));
|
||||
expect(parseVersionUploadForm(over).ok).toBe(false);
|
||||
});
|
||||
|
||||
it("fields ใน form ผิดกติกาส่งต่อ error ของ parseFieldsJson", () => {
|
||||
const form = baseForm();
|
||||
form.append("fields", '{"a":1}');
|
||||
expect(parseVersionUploadForm(form).ok).toBe(false);
|
||||
});
|
||||
|
||||
it("ค่าของ fields ไม่จำกัดความยาว (เอกสาร 100–200 หน้า — 2026-10-27) · key รับได้ถึง 1,000", () => {
|
||||
const big = baseForm();
|
||||
big.append("fields", JSON.stringify({ detail1: "พ".repeat(1_000_000) }));
|
||||
expect(parseVersionUploadForm(big).ok).toBe(true);
|
||||
|
||||
const manyKeys = baseForm();
|
||||
manyKeys.append(
|
||||
"fields",
|
||||
JSON.stringify(Object.fromEntries(Array.from({ length: 1_000 }, (_, i) => [`tag${i}`, "x"]))),
|
||||
);
|
||||
expect(parseVersionUploadForm(manyKeys).ok).toBe(true);
|
||||
const over = baseForm();
|
||||
over.append(
|
||||
"fields",
|
||||
JSON.stringify(Object.fromEntries(Array.from({ length: 1_001 }, (_, i) => [`tag${i}`, "x"]))),
|
||||
);
|
||||
expect(parseVersionUploadForm(over).ok).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("sanitizeDisplayFileName / sanitizeFilePartName", () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue