diff --git a/app/api/canvas/[id]/route.ts b/app/api/canvas/[id]/route.ts index 791d578..5d5a721 100644 --- a/app/api/canvas/[id]/route.ts +++ b/app/api/canvas/[id]/route.ts @@ -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 }); } }