ai-chatbot/lib/agents/agent-project-result-persistence.ts

68 lines
2.3 KiB
TypeScript

import "server-only";
import { and, eq } from "drizzle-orm";
import { extractAgentProjectStateFromCanvasData, isAgentProjectRow } from "@/lib/agents/agent-project-compat";
import { appendAgentProjectResultForSave } from "@/lib/agents/agent-project-save-merge";
import { db } from "@/lib/db";
import { canvasProject } from "@/lib/db/schema";
import type { AgentGenerationResultModeType } from "@/types/agent";
const UUID_PATTERN =
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
function getCanvasDataRecord(value: unknown) {
return value && typeof value === "object" && !Array.isArray(value)
? (value as Record<string, unknown>)
: {};
}
export async function persistAgentProjectGeneratedResult(params: {
projectId: string;
userId: string;
imageUrl: string;
modeType: AgentGenerationResultModeType;
}) {
const projectId = String(params.projectId || "").trim();
const userId = String(params.userId || "").trim();
const imageUrl = String(params.imageUrl || "").trim();
if (!UUID_PATTERN.test(projectId) || !UUID_PATTERN.test(userId) || !/^https?:\/\//i.test(imageUrl)) {
return false;
}
return db.transaction(async (tx) => {
const [project] = await tx
.select()
.from(canvasProject)
.where(and(eq(canvasProject.id, projectId), eq(canvasProject.userId, userId)))
.limit(1)
.for("update");
if (!project || !isAgentProjectRow(project)) {
return false;
}
const nextProjectState = appendAgentProjectResultForSave({
existingState: extractAgentProjectStateFromCanvasData(project.canvasData),
modeType: params.modeType,
imageUrl,
});
const canvasData = getCanvasDataRecord(project.canvasData);
const [updatedProject] = await tx
.update(canvasProject)
.set({
canvasData: {
...canvasData,
nodes: Array.isArray(canvasData.nodes) ? canvasData.nodes : [],
agentProjectState: nextProjectState,
} as unknown as typeof canvasProject.$inferInsert.canvasData,
thumbnail: project.thumbnail || imageUrl,
workspaceType: "agent",
updatedAt: new Date(),
})
.where(and(eq(canvasProject.id, projectId), eq(canvasProject.userId, userId)))
.returning({ id: canvasProject.id });
return Boolean(updatedProject);
});
}