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);