fix: backfill missing PSD layer previews
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-03-27 19:24:13 +08:00
parent e2698a7a49
commit 30b0d972e9
2 changed files with 88 additions and 2 deletions

View File

@ -36,6 +36,33 @@ function jsonError(status: number, error: string) {
return NextResponse.json(payload, { status });
}
async function repairTemplateLayerPreviewsIfNeeded(template: NonNullable<Awaited<ReturnType<typeof readAgentPsdTemplates>>[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);

View File

@ -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);