144 lines
4.3 KiB
TypeScript
144 lines
4.3 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { auth } from "@/app/(auth)/auth";
|
|
import {
|
|
getCanvasLayoutReplaceBatchActiveTaskId,
|
|
getCanvasLayoutReplaceBatchForUser,
|
|
markCanvasLayoutReplaceBatchItemsAdded,
|
|
retryCanvasLayoutReplaceBatchItem,
|
|
} from "@/lib/canvas/layout-replace-batch";
|
|
import {
|
|
enqueueCanvasImageTask,
|
|
ensureCanvasImageTaskActive,
|
|
} from "@/lib/canvas/image-task-queue";
|
|
|
|
function normalizeUuid(value: unknown) {
|
|
const id = String(value || "").trim();
|
|
return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)
|
|
? id
|
|
: "";
|
|
}
|
|
|
|
export async function GET(
|
|
_request: Request,
|
|
{ params }: { params: Promise<{ batchId: string }> }
|
|
) {
|
|
try {
|
|
const session = await auth();
|
|
if (!session?.user?.id) {
|
|
return NextResponse.json({ success: false, error: "未登录" }, { status: 401 });
|
|
}
|
|
const batchId = normalizeUuid((await params).batchId);
|
|
if (!batchId) {
|
|
return NextResponse.json({ success: false, error: "批次ID无效" }, { status: 400 });
|
|
}
|
|
|
|
let batch = await getCanvasLayoutReplaceBatchForUser({
|
|
batchId,
|
|
userId: session.user.id,
|
|
});
|
|
if (!batch) {
|
|
return NextResponse.json({ success: false, error: "批次不存在" }, { status: 404 });
|
|
}
|
|
const activeTaskId = getCanvasLayoutReplaceBatchActiveTaskId(batch);
|
|
if (activeTaskId) {
|
|
await ensureCanvasImageTaskActive({
|
|
taskId: activeTaskId,
|
|
userId: session.user.id,
|
|
});
|
|
batch = await getCanvasLayoutReplaceBatchForUser({
|
|
batchId,
|
|
userId: session.user.id,
|
|
});
|
|
}
|
|
|
|
return NextResponse.json({ success: true, batch });
|
|
} catch (error) {
|
|
console.error("[Canvas Layout Replace Batch][Detail] Error:", error);
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: error instanceof Error ? error.message : "查询批次失败",
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
export async function PATCH(
|
|
request: Request,
|
|
{ params }: { params: Promise<{ batchId: string }> }
|
|
) {
|
|
try {
|
|
const session = await auth();
|
|
if (!session?.user?.id) {
|
|
return NextResponse.json({ success: false, error: "未登录" }, { status: 401 });
|
|
}
|
|
const batchId = normalizeUuid((await params).batchId);
|
|
const body = await request.json().catch(() => ({}));
|
|
if (body?.action === "retry") {
|
|
const itemId = normalizeUuid(body?.itemId);
|
|
if (!batchId || !itemId) {
|
|
return NextResponse.json(
|
|
{ success: false, error: "缺少需要重试的结果" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
const taskId = await retryCanvasLayoutReplaceBatchItem({
|
|
batchId,
|
|
itemId,
|
|
userId: session.user.id,
|
|
});
|
|
if (!taskId) {
|
|
return NextResponse.json(
|
|
{ success: false, error: "该结果当前无法重试" },
|
|
{ status: 409 }
|
|
);
|
|
}
|
|
await enqueueCanvasImageTask(taskId);
|
|
return NextResponse.json({ success: true, taskId });
|
|
}
|
|
|
|
const items = Array.isArray(body?.items)
|
|
? body.items
|
|
.map((item: unknown) => {
|
|
const record =
|
|
item && typeof item === "object" && !Array.isArray(item)
|
|
? (item as Record<string, unknown>)
|
|
: {};
|
|
return {
|
|
itemId: normalizeUuid(record.itemId),
|
|
canvasNodeId: String(record.canvasNodeId || "").trim(),
|
|
};
|
|
})
|
|
.filter(
|
|
(item: { itemId: string; canvasNodeId: string }) =>
|
|
Boolean(item.itemId && item.canvasNodeId)
|
|
)
|
|
: [];
|
|
if (!batchId || items.length === 0) {
|
|
return NextResponse.json(
|
|
{ success: false, error: "缺少已添加的结果信息" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
const updated = await markCanvasLayoutReplaceBatchItemsAdded({
|
|
batchId,
|
|
userId: session.user.id,
|
|
items,
|
|
});
|
|
if (!updated) {
|
|
return NextResponse.json({ success: false, error: "批次不存在" }, { status: 404 });
|
|
}
|
|
return NextResponse.json({ success: true });
|
|
} catch (error) {
|
|
console.error("[Canvas Layout Replace Batch][PATCH] Error:", error);
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: error instanceof Error ? error.message : "更新批次失败",
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|