39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import type { Block, ProjectConfig } from "@/features/editor/state/editorStore";
|
|
import { buildStaticHtml } from "@/app/api/export/route";
|
|
|
|
// /api/export/preview 라우트는 Export 결과 HTML 을 ZIP 없이 바로 반환하는
|
|
// 경량 프리뷰용 엔드포인트이다. 에디터에서 Export 미리보기 UX 를 제공하기 위해 사용한다.
|
|
|
|
type PreviewRequestBody = {
|
|
blocks: Block[];
|
|
projectConfig?: ProjectConfig;
|
|
};
|
|
|
|
export async function POST(request: Request) {
|
|
let body: PreviewRequestBody;
|
|
|
|
try {
|
|
// JSON 본문을 파싱해서 blocks + projectConfig 를 추출한다.
|
|
body = (await request.json()) as PreviewRequestBody;
|
|
} catch {
|
|
// 잘못된 JSON 요청에 대해서는 400 에러를 반환한다.
|
|
return NextResponse.json({ message: "잘못된 JSON 요청입니다." }, { status: 400 });
|
|
}
|
|
|
|
const blocks = Array.isArray(body.blocks) ? body.blocks : [];
|
|
const projectConfig = body.projectConfig;
|
|
|
|
// Export 본문 HTML 은 기존 buildStaticHtml 을 재사용해서 생성한다.
|
|
// 이렇게 하면 /api/export ZIP 라우트와 동일한 정적 HTML 을 얻을 수 있다.
|
|
const html = buildStaticHtml(blocks, projectConfig);
|
|
|
|
// Export 미리보기는 ZIP 이 아니라 순수 HTML 문자열을 반환한다.
|
|
return new NextResponse(html, {
|
|
status: 200,
|
|
headers: {
|
|
"Content-Type": "text/html; charset=utf-8",
|
|
},
|
|
});
|
|
}
|