import { NextRequest, NextResponse } from "next/server"; import { auth } from "@/app/(auth)/auth"; import { getEditableAgentPsdTemplateLayers, isAgentPsdTextLayerSlot, isAgentPsdTemplateReady, type AgentPsdTemplateListResponse, } from "@/lib/agents/psd-template-config"; import { readAgentPsdFonts } from "@/lib/agents/psd-font-settings"; 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: AgentPsdTemplateListResponse = { success: false, templates: [], error, }; return NextResponse.json(payload, { status }); } export async function GET(request: NextRequest) { const session = await auth().catch(() => null); if (!session?.user?.id) { return jsonError(401, "未登录"); } try { const requestedBrand = String(request.nextUrl.searchParams.get("brand") || "").trim(); const fonts = await readAgentPsdFonts().catch(() => []); const fontMap = new Map(fonts.map((font) => [font.id, font])); const templates = (await readAgentPsdTemplates()) .filter((template) => template.status === "active") .filter(isAgentPsdTemplateReady) .filter((template) => requestedBrand ? template.brandName === requestedBrand : true ) .map((template) => ({ ...template, layers: getEditableAgentPsdTemplateLayers(template).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, }; }), })) .filter((template) => template.layers.length > 0); return NextResponse.json({ success: true, templates, } satisfies AgentPsdTemplateListResponse); } catch (error) { console.error("[PSD Templates] list failed:", error); return jsonError(503, "PSD 模板读取失败"); } }