import { getAsset } from "@/lib/server/data-store"; import { jsonError, jsonOk, readJsonBody } from "@/lib/server/api"; import { requireAppUser } from "@/lib/server/auth/current-user"; import { requestOrigin } from "@/lib/server/runtime"; import { saveMaskDataUrl } from "@/lib/server/storage"; import { submitImageJob } from "@/lib/server/generation-service"; export const runtime = "nodejs"; export async function POST(request: Request, context: { params: Promise<{ id: string }> }) { try { const user = await requireAppUser(); const { id } = await context.params; const asset = await getAsset(id); if (!asset || asset.ownerId !== user.id) return jsonError(new Error("Asset not found."), 404); const body = await readJsonBody<{ prompt?: string; maskDataUrl?: string; maskUrl?: string; seed?: number; }>(request); let maskUrl = body.maskUrl; let maskAssetId: string | undefined; if (body.maskDataUrl) { const mask = await saveMaskDataUrl({ ownerId: asset.ownerId, dataUrl: body.maskDataUrl, origin: requestOrigin(request), jobHint: asset.id }); maskUrl = mask.url; maskAssetId = mask.id; } if (!maskUrl) throw new Error("maskDataUrl or maskUrl is required for inpainting."); const job = await submitImageJob({ ownerId: user.id, capability: "image.inpaint", prompt: body.prompt || "删除", imageUrls: [asset.url, maskUrl], inputAssetIds: [asset.id, ...(maskAssetId ? [maskAssetId] : [])], seed: typeof body.seed === "number" ? body.seed : undefined }, requestOrigin(request)); return jsonOk({ job }, { status: 202 }); } catch (error) { return jsonError(error); } }