diff --git a/app/api/admin/psd-templates/[id]/route.ts b/app/api/admin/psd-templates/[id]/route.ts index beecea087..8e8ecab01 100644 --- a/app/api/admin/psd-templates/[id]/route.ts +++ b/app/api/admin/psd-templates/[id]/route.ts @@ -36,6 +36,33 @@ function jsonError(status: number, error: string) { return NextResponse.json(payload, { status }); } +async function repairTemplateLayerPreviewsIfNeeded(template: NonNullable>[number]>) { + const needsRepair = template.layers.some((layer) => !String(layer.previewUrl || "").trim()); + if (!needsRepair) { + return template; + } + + try { + const preparedAssets = await preparePsdTemplateRenderAssets({ + templateId: template.id, + fileUrl: template.fileUrl, + layers: template.layers, + }); + + return { + ...template, + layers: preparedAssets.layers, + updatedAt: new Date().toISOString(), + }; + } catch (error) { + console.warn("[PSD Templates][Admin] failed to repair missing layer previews:", { + templateId: template.id, + error, + }); + return template; + } +} + export async function GET( request: NextRequest, context: { params: Promise<{ id: string }> } @@ -54,9 +81,18 @@ export async function GET( return jsonError(404, "未找到 PSD 模板"); } + const repairedTemplate = await repairTemplateLayerPreviewsIfNeeded(template); + if (repairedTemplate !== template) { + await upsertSystemSetting({ + key: AGENT_PSD_TEMPLATES_KEY, + value: templates.map((entry) => (entry.id === id ? repairedTemplate : entry)), + updatedBy: session.user.id, + }); + } + return NextResponse.json({ success: true, - template, + template: repairedTemplate, } satisfies AgentPsdTemplateMutationResponse); } catch (error) { console.error("[PSD Templates][Admin] get failed:", error); diff --git a/app/api/admin/psd-templates/route.ts b/app/api/admin/psd-templates/route.ts index d3df3234b..0a2b093ae 100644 --- a/app/api/admin/psd-templates/route.ts +++ b/app/api/admin/psd-templates/route.ts @@ -48,6 +48,37 @@ function getDefaultTemplateName(fileName: string) { return fileName.replace(/\.[^.]+$/, "").trim() || "未命名 PSD 模板"; } +async function repairTemplateLayerPreviewsIfNeeded(params: { + template: AgentPsdTemplate; +}) { + const { template } = params; + const needsRepair = template.layers.some((layer) => !String(layer.previewUrl || "").trim()); + + if (!needsRepair) { + return template; + } + + try { + const preparedAssets = await preparePsdTemplateRenderAssets({ + templateId: template.id, + fileUrl: template.fileUrl, + layers: template.layers, + }); + + return { + ...template, + layers: preparedAssets.layers, + updatedAt: new Date().toISOString(), + } satisfies AgentPsdTemplate; + } catch (error) { + console.warn("[PSD Templates][Admin] failed to repair missing layer previews:", { + templateId: template.id, + error, + }); + return template; + } +} + export async function GET() { const session = await requireAgentWorkflowAdmin().catch(() => null); if (!session?.user?.id) { @@ -56,9 +87,28 @@ export async function GET() { try { const templates = await readAgentPsdTemplates(); + const repairedTemplates = [] as AgentPsdTemplate[]; + let hasRepairedTemplate = false; + + for (const template of templates) { + const repairedTemplate = await repairTemplateLayerPreviewsIfNeeded({ template }); + repairedTemplates.push(repairedTemplate); + if (repairedTemplate !== template) { + hasRepairedTemplate = true; + } + } + + if (hasRepairedTemplate) { + await upsertSystemSetting({ + key: AGENT_PSD_TEMPLATES_KEY, + value: repairedTemplates, + updatedBy: session.user.id, + }); + } + return NextResponse.json({ success: true, - templates, + templates: hasRepairedTemplate ? repairedTemplates : templates, } satisfies AgentPsdTemplateListResponse); } catch (error) { console.error("[PSD Templates][Admin] list failed:", error);