import { NextRequest, NextResponse } from "next/server"; import { and, desc, eq } from "drizzle-orm"; import { z } from "zod"; import { auth } from "@/app/(auth)/auth"; import { db } from "@/lib/db"; import { canvasProject } from "@/lib/db/schema"; import { extractAgentProjectStateFromCanvasData, isAgentProjectRow, } from "@/lib/agents/agent-project-compat"; import { normalizeAgentGenerationProjectPersistedState } from "@/lib/agents/generation-project-state"; export const dynamic = "force-dynamic"; export const revalidate = 0; function mapAgentProjectRow(row: typeof canvasProject.$inferSelect) { return { id: row.id, userId: row.userId, title: row.title, description: row.description || null, thumbnail: row.thumbnail || null, projectState: extractAgentProjectStateFromCanvasData(row.canvasData), createdAt: row.createdAt, updatedAt: row.updatedAt, }; } export async function GET() { try { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); } const projects = await db .select() .from(canvasProject) .where(eq(canvasProject.userId, session.user.id)) .orderBy(desc(canvasProject.updatedAt)); return NextResponse.json({ success: true, data: projects.filter(isAgentProjectRow).map(mapAgentProjectRow), }); } catch (error) { console.error("[AgentProjects API] 获取项目列表失败:", error); return NextResponse.json({ success: false, error: "获取生图项目列表失败" }, { status: 500 }); } } export async function POST(request: NextRequest) { try { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); } const body = await request.json().catch(() => ({})); const requestedId = body.id === undefined ? undefined : z.string().uuid().safeParse(body.id); if (requestedId && !requestedId.success) { return NextResponse.json({ success: false, error: "项目编号无效" }, { status: 400 }); } const id = requestedId?.data; const title = String(body.title || "").trim() || "未命名生图项目"; const description = String(body.description || "").trim() || null; const thumbnail = String(body.thumbnail || "").trim() || null; const projectState = normalizeAgentGenerationProjectPersistedState(body.projectState); const [insertedProject] = await db .insert(canvasProject) .values({ id, userId: session.user.id, title, description, thumbnail, workspaceType: "agent", canvasData: { nodes: [], edges: [], selectedNodeIds: [], viewport: { x: 0, y: 0, zoom: 1 }, tool: "select", agentProjectState: projectState, } as any, }) .onConflictDoNothing({ target: canvasProject.id }) .returning(); const project = insertedProject || (id ? (await db .select() .from(canvasProject) .where(and( eq(canvasProject.id, id), eq(canvasProject.userId, session.user.id), eq(canvasProject.workspaceType, "agent") )) .limit(1))[0] : undefined); if (!project) { return NextResponse.json({ success: false, error: "项目编号不可用,请重试" }, { status: 409 }); } return NextResponse.json({ success: true, data: mapAgentProjectRow(project) }); } catch (error) { console.error("[AgentProjects API] 创建项目失败:", error); return NextResponse.json({ success: false, error: "创建生图项目失败" }, { status: 500 }); } }