fix: 画布 API 支持 upsert 操作

当画布不存在时自动创建,而不是返回 404

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Your Name 2026-02-01 12:36:18 +08:00
parent c78743cbed
commit e84b002302

View File

@ -38,7 +38,7 @@ export async function GET(
}
}
// 更新画布
// 更新画布(支持 upsert:如果不存在则创建)
export async function PUT(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
@ -53,30 +53,58 @@ export async function PUT(
const body = await request.json();
const { title, description, thumbnail, canvasData } = body;
const updateData: any = { updatedAt: new Date() };
if (title !== undefined) updateData.title = title;
if (description !== undefined) updateData.description = description;
if (thumbnail !== undefined) updateData.thumbnail = thumbnail;
if (canvasData !== undefined) updateData.canvasData = canvasData;
const [updatedProject] = await db
.update(canvasProject)
.set(updateData)
// 先检查画布是否存在
const [existingProject] = await db
.select()
.from(canvasProject)
.where(
and(
eq(canvasProject.id, id),
eq(canvasProject.userId, session.user.id)
)
)
.returning();
);
if (!updatedProject) {
return NextResponse.json({ success: false, error: '画布不存在' }, { status: 404 });
if (existingProject) {
// 更新现有画布
const updateData: any = { updatedAt: new Date() };
if (title !== undefined) updateData.title = title;
if (description !== undefined) updateData.description = description;
if (thumbnail !== undefined) updateData.thumbnail = thumbnail;
if (canvasData !== undefined) updateData.canvasData = canvasData;
const [updatedProject] = await db
.update(canvasProject)
.set(updateData)
.where(
and(
eq(canvasProject.id, id),
eq(canvasProject.userId, session.user.id)
)
)
.returning();
return NextResponse.json({ success: true, data: updatedProject });
} else {
// 创建新画布(使用指定 ID)
const [newProject] = await db
.insert(canvasProject)
.values({
id, // 使用指定的 ID
userId: session.user.id,
title: title || '未命名画布',
description,
canvasData: canvasData || {
nodes: [],
edges: [],
viewport: { x: 0, y: 0, zoom: 1 },
},
})
.returning();
return NextResponse.json({ success: true, data: newProject });
}
return NextResponse.json({ success: true, data: updatedProject });
} catch (error) {
console.error('更新画布失败:', error);
console.error('更新/创建画布失败:', error);
return NextResponse.json({ success: false, error: '更新画布失败' }, { status: 500 });
}
}