import { NextRequest, NextResponse } from "next/server"; import { and, eq } from "drizzle-orm"; import { auth } from "@/app/(auth)/auth"; import { db } from "@/lib/db"; import { canvasProject } from "@/lib/db/schema"; import { createEmptyAgentGenerationProjectPersistedState, normalizeAgentGenerationProjectPersistedState, } from "@/lib/agents/generation-project-state"; export const dynamic = "force-dynamic"; export const revalidate = 0; function mapAgentProjectRow(row: typeof canvasProject.$inferSelect) { const canvasData = row.canvasData && typeof row.canvasData === "object" && !Array.isArray(row.canvasData) ? (row.canvasData as Record) : {}; return { id: row.id, userId: row.userId, title: row.title, description: row.description || null, thumbnail: row.thumbnail || null, projectState: normalizeAgentGenerationProjectPersistedState( canvasData.agentProjectState || createEmptyAgentGenerationProjectPersistedState() ), createdAt: row.createdAt, updatedAt: row.updatedAt, }; } export async function GET( request: NextRequest, { params }: { params: Promise<{ id: string }> } ) { try { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); } const { id } = await params; const [project] = await db .select() .from(canvasProject) .where( and( eq(canvasProject.id, id), eq(canvasProject.userId, session.user.id), eq(canvasProject.workspaceType, "agent") ) ) .limit(1); if (!project) { return NextResponse.json({ success: false, error: "生图项目不存在" }, { status: 404 }); } return NextResponse.json({ success: true, data: mapAgentProjectRow(project) }); } catch (error) { console.error("[AgentProjects API] 获取项目失败:", error); return NextResponse.json({ success: false, error: "获取生图项目失败" }, { status: 500 }); } } export async function PUT( request: NextRequest, { params }: { params: Promise<{ id: string }> } ) { try { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); } const { id } = await params; const body = await request.json().catch(() => ({})); const [existingProject] = await db .select() .from(canvasProject) .where( and( eq(canvasProject.id, id), eq(canvasProject.userId, session.user.id), eq(canvasProject.workspaceType, "agent") ) ) .limit(1); if (!existingProject) { return NextResponse.json({ success: false, error: "生图项目不存在" }, { status: 404 }); } const title = body.title !== undefined ? String(body.title || "").trim() || "未命名生图项目" : undefined; const description = body.description !== undefined ? String(body.description || "").trim() || null : undefined; const thumbnail = body.thumbnail !== undefined ? String(body.thumbnail || "").trim() || null : undefined; const existingCanvasData = existingProject.canvasData && typeof existingProject.canvasData === "object" && !Array.isArray(existingProject.canvasData) ? (existingProject.canvasData as Record) : {}; const nextProjectState = body.projectState !== undefined ? normalizeAgentGenerationProjectPersistedState(body.projectState) : normalizeAgentGenerationProjectPersistedState( existingCanvasData.agentProjectState || createEmptyAgentGenerationProjectPersistedState() ); const [project] = await db .update(canvasProject) .set({ title, description, thumbnail, updatedAt: new Date(), canvasData: { nodes: [], edges: [], selectedNodeIds: [], viewport: { x: 0, y: 0, zoom: 1 }, tool: "select", agentProjectState: nextProjectState, } as any, }) .where( and( eq(canvasProject.id, id), eq(canvasProject.userId, session.user.id), eq(canvasProject.workspaceType, "agent") ) ) .returning(); return NextResponse.json({ success: true, data: mapAgentProjectRow(project) }); } catch (error) { console.error("[AgentProjects API] 保存项目失败:", error); return NextResponse.json({ success: false, error: "保存生图项目失败" }, { status: 500 }); } } export async function DELETE( request: NextRequest, { params }: { params: Promise<{ id: string }> } ) { try { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); } const { id } = await params; const [project] = await db .delete(canvasProject) .where( and( eq(canvasProject.id, id), eq(canvasProject.userId, session.user.id), eq(canvasProject.workspaceType, "agent") ) ) .returning(); if (!project) { return NextResponse.json({ success: false, error: "生图项目不存在" }, { status: 404 }); } return NextResponse.json({ success: true, data: mapAgentProjectRow(project) }); } catch (error) { console.error("[AgentProjects API] 删除项目失败:", error); return NextResponse.json({ success: false, error: "删除生图项目失败" }, { status: 500 }); } }