From d283675230141498d7c7740a5bb75306538347c4 Mon Sep 17 00:00:00 2001 From: Manus Date: Fri, 10 Jul 2026 21:14:55 -0400 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Purge=20automatique=20des=20tombs?= =?UTF-8?q?tones=20(processed=5Fdedup=5Fkeys)=20de=20plus=20de=206=20mois?= =?UTF-8?q?=20:=20-=20purgeOldArticles=20dans=20db.ts=20:=20suppression=20?= =?UTF-8?q?des=20entr=C3=A9es=20processedDedupKeys.processedAt=20<=3D=20cu?= =?UTF-8?q?toff=206=20mois=20-=20Logs=20cron=20et=20init=20mis=20=C3=A0=20?= =?UTF-8?q?jour=20pour=20afficher=20le=20nombre=20de=20tombstones=20suppri?= =?UTF-8?q?m=C3=A9s=20-=200=20erreur=20TypeScript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/public/__manus__/version.json | 4 ++-- server/_core/index.ts | 8 ++++---- server/db.ts | 8 +++++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/client/public/__manus__/version.json b/client/public/__manus__/version.json index 490154a..68d81b2 100644 --- a/client/public/__manus__/version.json +++ b/client/public/__manus__/version.json @@ -1,4 +1,4 @@ { - "version": "bb8a78b4", - "timestamp": 1783732106605 + "version": "509dd73b", + "timestamp": 1783732495856 } \ No newline at end of file diff --git a/server/_core/index.ts b/server/_core/index.ts index e5ee2cd..b3b66d1 100644 --- a/server/_core/index.ts +++ b/server/_core/index.ts @@ -98,8 +98,8 @@ export async function scheduleDailyImport() { const retentionMonths = retentionStr ? parseInt(retentionStr, 10) : 0; if (retentionMonths > 0) { const purged = await purgeOldArticles(retentionMonths); - if (purged.veille > 0 || purged.aap > 0) { - console.log(`[Cron] Purge rétention (${retentionMonths} mois) — Veille: -${purged.veille} | AAP: -${purged.aap}`); + if (purged.veille > 0 || purged.aap > 0 || purged.tombstones > 0) { + console.log(`[Cron] Purge rétention (${retentionMonths} mois) — Veille: -${purged.veille} | AAP: -${purged.aap} | Tombstones: -${purged.tombstones}`); } } } catch (e) { @@ -236,8 +236,8 @@ async function startServer() { const retentionMonths = retentionStr ? parseInt(retentionStr, 10) : 0; if (retentionMonths > 0) { const purged = await purgeOldArticles(retentionMonths); - if (purged.veille > 0 || purged.aap > 0) { - console.log(`[Init] Purge rétention (${retentionMonths} mois) — Veille: -${purged.veille} | AAP: -${purged.aap}`); + if (purged.veille > 0 || purged.aap > 0 || purged.tombstones > 0) { + console.log(`[Init] Purge rétention (${retentionMonths} mois) — Veille: -${purged.veille} | AAP: -${purged.aap} | Tombstones: -${purged.tombstones}`); } } } catch (e) { diff --git a/server/db.ts b/server/db.ts index a63095e..ac483bc 100644 --- a/server/db.ts +++ b/server/db.ts @@ -14,6 +14,7 @@ import { InsertIdea, rssFeeds, rssSettings, + processedDedupKeys, type InsertRssFeed, type InsertRssSettings, type ImportLog, @@ -489,16 +490,21 @@ export async function saveRssSettings(data: Partial { +export async function purgeOldArticles(retentionMonths: number): Promise<{ veille: number; aap: number; tombstones: number }> { const db = await getDb(); if (!db) throw new Error("Database not available"); const cutoff = new Date(); cutoff.setMonth(cutoff.getMonth() - retentionMonths); const veilleResult = await db.delete(veilleItems).where(lte(veilleItems.importedAt, cutoff)); const aapResult = await db.delete(aapItems).where(lte(aapItems.importedAt, cutoff)); + // Purge des tombstones (processed_dedup_keys) de plus de 6 mois + const tombstoneCutoff = new Date(); + tombstoneCutoff.setMonth(tombstoneCutoff.getMonth() - 6); + const tombstoneResult = await db.delete(processedDedupKeys).where(lte(processedDedupKeys.processedAt, tombstoneCutoff)); return { veille: (veilleResult as any).affectedRows ?? 0, aap: (aapResult as any).affectedRows ?? 0, + tombstones: (tombstoneResult as any).affectedRows ?? 0, }; }