Your Name df6694de5d
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
perf: speed up PSD template loading
2026-04-10 22:01:29 +08:00

98 lines
2.9 KiB
TypeScript

import { NextResponse } from "next/server";
import { auth } from "@/app/(auth)/auth";
import { readAgentPsdFonts } from "@/lib/agents/psd-font-settings";
import {
type AgentPsdTemplateMutationResponse,
getEditableAgentPsdTemplateLayers,
isAgentPsdTemplateReady,
isAgentPsdTemplateRuntimeReady,
isAgentPsdTextLayerSlot,
} from "@/lib/agents/psd-template-config";
import { repairAgentPsdTemplateFontBindings } from "@/lib/agents/psd-template-repair";
import { readAgentPsdTemplates } from "@/lib/agents/psd-template-settings";
export const runtime = "nodejs";
export const dynamic = "force-dynamic";
function jsonError(status: number, error: string) {
const payload: AgentPsdTemplateMutationResponse = {
success: false,
error,
};
return NextResponse.json(payload, { status });
}
export async function GET(
_request: Request,
context: { params: Promise<{ id: string }> }
) {
const session = await auth().catch(() => null);
if (!session?.user?.id) {
return jsonError(401, "未登录");
}
try {
const { id } = await context.params;
const [templates, fonts] = await Promise.all([
readAgentPsdTemplates(),
readAgentPsdFonts().catch(
() => [] as Awaited<ReturnType<typeof readAgentPsdFonts>>
),
]);
const fontMap = new Map(fonts.map((font) => [font.id, font]));
const currentTemplate = templates.find(
(candidateTemplate) => candidateTemplate.id === id
);
if (!currentTemplate || currentTemplate.status !== "active") {
return jsonError(404, "未找到 PSD 模板");
}
if (!isAgentPsdTemplateReady(currentTemplate)) {
return jsonError(409, "PSD 模板尚未完成解析");
}
if (!isAgentPsdTemplateRuntimeReady(currentTemplate)) {
return jsonError(409, "PSD 模板资源尚未准备完成,请稍后重试");
}
if (getEditableAgentPsdTemplateLayers(currentTemplate).length === 0) {
return jsonError(409, "当前模板没有可编辑图层");
}
const template = repairAgentPsdTemplateFontBindings(currentTemplate, fonts);
const normalizedTemplate = {
...template,
layers: template.layers.map((layer) => {
if (!isAgentPsdTextLayerSlot(layer) || !layer.fontId) {
return layer;
}
const font = fontMap.get(layer.fontId);
if (!font) {
return layer;
}
return {
...layer,
fontFileUrl: font.fileUrl,
fontContentType: font.contentType,
};
}),
};
const response = NextResponse.json({
success: true,
template: normalizedTemplate,
} satisfies AgentPsdTemplateMutationResponse);
response.headers.set(
"Cache-Control",
"private, max-age=60, stale-while-revalidate=300"
);
return response;
} catch (error) {
console.error("[PSD Templates] detail failed:", error);
return jsonError(503, "PSD 模板详情读取失败");
}
}