34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
import { and, eq } from "drizzle-orm";
|
|
import { db } from "@/lib/db";
|
|
import { canvasProject } from "@/lib/db/schema";
|
|
import { AgentRunError } from "./store";
|
|
|
|
export type RuntimeImageNode = {
|
|
id: string;
|
|
type: string;
|
|
position: { x: number; y: number };
|
|
size?: { width?: number; height?: number };
|
|
data: { src?: string; url?: string; title?: string; prompt?: string; status?: string };
|
|
};
|
|
export async function readOwnedCanvas(userId: string, projectId: string) {
|
|
const [project] = await db
|
|
.select()
|
|
.from(canvasProject)
|
|
.where(and(eq(canvasProject.id, projectId), eq(canvasProject.userId, userId)))
|
|
.limit(1);
|
|
if (!project) throw new AgentRunError("画布不存在", 404);
|
|
const data = project.canvasData as { nodes?: RuntimeImageNode[] } | null;
|
|
return { project, nodes: Array.isArray(data?.nodes) ? data.nodes : [] };
|
|
}
|
|
export async function readCanvasImages(userId: string, projectId: string, ids: string[]) {
|
|
const { nodes } = await readOwnedCanvas(userId, projectId);
|
|
return ids.map((id) => {
|
|
const node = nodes.find((item) => item.id === id && item.type === "image");
|
|
if (!node) throw new AgentRunError(`图片节点不存在:${id}`, 404);
|
|
if (!/^https?:\/\//i.test(node.data.src || node.data.url || "")) {
|
|
throw new AgentRunError("图片仍在上传,请等待上传完成。");
|
|
}
|
|
return node;
|
|
});
|
|
}
|