diff --git a/lib/db/queries.ts b/lib/db/queries.ts index c937de70f..3335e9755 100644 --- a/lib/db/queries.ts +++ b/lib/db/queries.ts @@ -11,6 +11,7 @@ import { inArray, like, lt, + notInArray, or, sql, type SQL, @@ -1711,7 +1712,6 @@ export async function syncCanvasNodesForProject(params: { eq(mediaAssetRelation.relationType, "located_on_canvas"), ), ); - await db.delete(canvasNode).where(eq(canvasNode.projectId, params.projectId)); const now = new Date(); const insertableNodes = enrichedNodes.map((node) => { @@ -1744,7 +1744,32 @@ export async function syncCanvasNodesForProject(params: { }); if (insertableNodes.length > 0) { - await db.insert(canvasNode).values(insertableNodes); + await db + .insert(canvasNode) + .values(insertableNodes) + .onConflictDoUpdate({ + target: canvasNode.id, + set: { + projectId: sql`excluded."projectId"`, + type: sql`excluded."type"`, + position: sql`excluded."position"`, + size: sql`excluded."size"`, + data: sql`excluded."data"`, + connections: sql`excluded."connections"`, + parentId: sql`excluded."parentId"`, + updatedAt: sql`excluded."updatedAt"`, + }, + }); + + const activeNodeIds = insertableNodes.map((node) => node.id); + await db.delete(canvasNode).where( + and( + eq(canvasNode.projectId, params.projectId), + notInArray(canvasNode.id, activeNodeIds), + ), + ); + } else { + await db.delete(canvasNode).where(eq(canvasNode.projectId, params.projectId)); } for (const node of enrichedNodes) {