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, }; }