From 13b6385dbce6cab0b22acccd229e7846e4869cf9 Mon Sep 17 00:00:00 2001 From: Manus Deploy Date: Sun, 3 May 2026 06:44:12 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20ajouter=20try/catch=20dans=20les=20blocs?= =?UTF-8?q?=20else=20de=20migrateExistingItems=20pour=20g=C3=A9rer=20les?= =?UTF-8?q?=20violations=20UNIQUE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/rssEngine.ts | 80 +++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 28 deletions(-) diff --git a/server/rssEngine.ts b/server/rssEngine.ts index 92a8623..50882ae 100644 --- a/server/rssEngine.ts +++ b/server/rssEngine.ts @@ -546,23 +546,35 @@ export async function migrateExistingItems(): Promise { const newDedupKey = dedupHash(normalizedTitle + "|veille"); // Mettre à jour le principal - await db.update(veilleItems) - .set({ - categorie: newCategorie, - niveau: allTerritoires.length > 1 ? "departemental" : "regional", - territoire: allTerritoires.length > 0 ? allTerritoires[0] : "Auvergne-Rhône-Alpes", - territoires: JSON.stringify(allTerritoires), - titre: primary.titre, - dedupKey: newDedupKey, - }) - .where(eq(veilleItems.id, primary.id)); + try { + await db.update(veilleItems) + .set({ + categorie: newCategorie, + niveau: allTerritoires.length > 1 ? "departemental" : "regional", + territoire: allTerritoires.length > 0 ? allTerritoires[0] : "Auvergne-Rhône-Alpes", + territoires: JSON.stringify(allTerritoires), + titre: primary.titre, + dedupKey: newDedupKey, + }) + .where(eq(veilleItems.id, primary.id)); - // Supprimer les doublons - for (const dup of duplicates) { - await db.delete(veilleItems).where(eq(veilleItems.id, dup.id)); - veilleMerged++; + // Supprimer les doublons + for (const dup of duplicates) { + await db.delete(veilleItems).where(eq(veilleItems.id, dup.id)); + veilleMerged++; + } + veilleUpdated++; + } catch (e: any) { + // Si le newDedupKey existe déjà → supprimer tout le groupe + if (e?.code === "ER_DUP_ENTRY" || e?.cause?.code === "ER_DUP_ENTRY" || e?.cause?.message?.includes("Duplicate entry")) { + for (const row of sorted) { + await db.delete(veilleItems).where(eq(veilleItems.id, row.id)); + veilleMerged++; + } + } else { + throw e; + } } - veilleUpdated++; } } @@ -622,21 +634,33 @@ export async function migrateExistingItems(): Promise { const normalizedTitle = buildMergeKey(primary.titre || ""); const newDedupKey = dedupHash(normalizedTitle + "|aap"); - await db.update(aapItems) - .set({ - region: "Auvergne-Rhône-Alpes", - departement: allDepts.length > 0 ? allDepts[0] : null, - departements: JSON.stringify(allDepts), - titre: primary.titre, - dedupKey: newDedupKey, - }) - .where(eq(aapItems.id, primary.id)); + try { + await db.update(aapItems) + .set({ + region: "Auvergne-Rhône-Alpes", + departement: allDepts.length > 0 ? allDepts[0] : null, + departements: JSON.stringify(allDepts), + titre: primary.titre, + dedupKey: newDedupKey, + }) + .where(eq(aapItems.id, primary.id)); - for (const dup of duplicates) { - await db.delete(aapItems).where(eq(aapItems.id, dup.id)); - aapMerged++; + for (const dup of duplicates) { + await db.delete(aapItems).where(eq(aapItems.id, dup.id)); + aapMerged++; + } + aapUpdated++; + } catch (e: any) { + // Si le newDedupKey existe déjà → supprimer tout le groupe + if (e?.code === "ER_DUP_ENTRY" || e?.cause?.code === "ER_DUP_ENTRY" || e?.cause?.message?.includes("Duplicate entry")) { + for (const row of sorted) { + await db.delete(aapItems).where(eq(aapItems.id, row.id)); + aapMerged++; + } + } else { + throw e; + } } - aapUpdated++; } }