From e502ca97d8a9d84996dc453f448552f5cc442509 Mon Sep 17 00:00:00 2001 From: Manus Deploy Date: Sun, 3 May 2026 06:31:56 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20g=C3=A9rer=20les=20violations=20UNIQUE?= =?UTF-8?q?=20dans=20migrateExistingItems=20(supprimer=20les=20doublons)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/rssEngine.ts | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/server/rssEngine.ts b/server/rssEngine.ts index 9d71083..92a8623 100644 --- a/server/rssEngine.ts +++ b/server/rssEngine.ts @@ -503,7 +503,8 @@ export async function migrateExistingItems(): Promise { const normalizedTitle = buildMergeKey(row.titre || ""); const newDedupKey = dedupHash(normalizedTitle + "|veille"); - await db.update(veilleItems) + try { + await db.update(veilleItems) .set({ categorie: newCategorie, niveau: newNiveau, @@ -514,6 +515,15 @@ export async function migrateExistingItems(): Promise { }) .where(eq(veilleItems.id, row.id)); veilleUpdated++; + } catch (e: any) { + // Si le nouveau dedupKey existe déjà → cet article est un doublon, le supprimer + if (e?.code === "ER_DUP_ENTRY" || e?.cause?.code === "ER_DUP_ENTRY" || e?.cause?.message?.includes("Duplicate entry")) { + await db.delete(veilleItems).where(eq(veilleItems.id, row.id)); + veilleMerged++; + } else { + throw e; + } + } } else { // Groupe : fusionner en gardant le premier, supprimer les autres const sorted = group.sort((a: (typeof veilleRows)[number], b: (typeof veilleRows)[number]) => a.id - b.id); @@ -575,7 +585,8 @@ export async function migrateExistingItems(): Promise { const normalizedTitle = buildMergeKey(row.titre || ""); const newDedupKey = dedupHash(normalizedTitle + "|aap"); - await db.update(aapItems) + try { + await db.update(aapItems) .set({ region: newRegion, departement: newDept, @@ -585,6 +596,15 @@ export async function migrateExistingItems(): Promise { }) .where(eq(aapItems.id, row.id)); aapUpdated++; + } catch (e: any) { + // Si le nouveau dedupKey existe déjà → cet article est un doublon, le supprimer + if (e?.code === "ER_DUP_ENTRY" || e?.cause?.code === "ER_DUP_ENTRY" || e?.cause?.message?.includes("Duplicate entry")) { + await db.delete(aapItems).where(eq(aapItems.id, row.id)); + aapMerged++; + } else { + throw e; + } + } } else { // Fusionner const sorted = group.sort((a: (typeof aapRows)[number], b: (typeof aapRows)[number]) => a.id - b.id);