34 lines
2.1 KiB
TypeScript
34 lines
2.1 KiB
TypeScript
|
|
import fs from "node:fs";
|
||
|
|
import path from "node:path";
|
||
|
|
|
||
|
|
import { requestOrigin } from "@/utils/request-origin";
|
||
|
|
|
||
|
|
// GET /wordaddin/manifest.xml — manifest ของ Word add-in สำหรับ sideload
|
||
|
|
//
|
||
|
|
// URL ใน manifest เป็น absolute https ตามข้อบังคับของ Office แต่ต้องต่างกันตาม
|
||
|
|
// environment — เดิมใช้ไฟล์ static ใน public/ ค่า dev (localhost:3000) แล้วให้ผู้
|
||
|
|
// deploy rewrite มือเองทุกครั้ง (docs/WORDADDIN-DEV.md) ตอนนี้ serve ผ่าน route
|
||
|
|
// แทน: อ่าน template (public/wordaddin/manifest.template.xml — ค่า dev) แล้ว
|
||
|
|
// เขียนทับ origin ให้ตรงโฮสต์ที่ขอไฟล์ (dev/UAT/production ใช้ template
|
||
|
|
// เดียวกัน — โหลดจาก environment ไหน manifest ก็ชี้ environment นั้น)
|
||
|
|
//
|
||
|
|
// อ่านจาก public/ เพราะเป็นที่เดียวที่การันตีว่ามีใน standalone ของ Docker
|
||
|
|
// (runner stage COPY public — ไฟล์ app/ ต้นฉบับไม่ถูกก๊อปเข้า image)
|
||
|
|
|
||
|
|
/** origin dev ที่ฝังใน template — สตริงเดียวที่ถูกแทนที่ทั้งไฟล์ (6 จุด) */
|
||
|
|
const DEV_ORIGIN = "https://localhost:3000";
|
||
|
|
|
||
|
|
const TEMPLATE = path.join(process.cwd(), "public", "wordaddin", "manifest.template.xml");
|
||
|
|
|
||
|
|
export function GET(req: Request): Response {
|
||
|
|
const template = fs.readFileSync(TEMPLATE, "utf8");
|
||
|
|
const manifest = template.replaceAll(DEV_ORIGIN, requestOrigin(req));
|
||
|
|
return new Response(manifest, {
|
||
|
|
headers: {
|
||
|
|
"content-type": "application/xml; charset=utf-8",
|
||
|
|
// origin ขึ้นกับ header ของผู้ขอ — ห้ามแคกลามผู้ใช้เกินครั้งเดียวต่อ download
|
||
|
|
"cache-control": "no-store",
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|