feat: purger les contenus expirés ou anciens
This commit is contained in:
49
server/db.ts
49
server/db.ts
@@ -684,3 +684,52 @@ export async function purgeAapItems(): Promise<number> {
|
||||
const result = await db.delete(aapItems);
|
||||
return (result as any).affectedRows ?? 0;
|
||||
}
|
||||
|
||||
/** Calcule une date limite calendaire sans approximer un mois par un nombre de jours. */
|
||||
function cutoffForRetentionMonths(months: number): Date {
|
||||
const cutoff = new Date();
|
||||
cutoff.setMonth(cutoff.getMonth() - months);
|
||||
return cutoff;
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprime les articles de veille dont la date de publication est trop ancienne.
|
||||
* Pour les imports dont la source ne fournit pas cette date, importedAt garantit
|
||||
* une purge prévisible plutôt que de conserver indéfiniment l'article.
|
||||
*/
|
||||
export async function purgeVeilleItemsOlderThan(months: number): Promise<number> {
|
||||
const db = await getDb();
|
||||
if (!db) throw new Error("Database not available");
|
||||
|
||||
const cutoff = cutoffForRetentionMonths(months);
|
||||
const where = sql`COALESCE(${veilleItems.datePublication}, ${veilleItems.importedAt}) <= ${cutoff}`;
|
||||
const items = await db.select({ id: veilleItems.id }).from(veilleItems).where(where);
|
||||
await removeArticleReadRecords("veille", items.map((item: { id: number }) => item.id));
|
||||
const result = await db.delete(veilleItems).where(where);
|
||||
return (result as any).affectedRows ?? 0;
|
||||
}
|
||||
|
||||
/** Supprime les AAP clôturés dont la date de clôture est connue. */
|
||||
export async function purgeExpiredAapItems(): Promise<number> {
|
||||
const db = await getDb();
|
||||
if (!db) throw new Error("Database not available");
|
||||
|
||||
const where = lte(aapItems.dateCloture, new Date());
|
||||
const items = await db.select({ id: aapItems.id }).from(aapItems).where(where);
|
||||
await removeArticleReadRecords("aap", items.map((item: { id: number }) => item.id));
|
||||
const result = await db.delete(aapItems).where(where);
|
||||
return (result as any).affectedRows ?? 0;
|
||||
}
|
||||
|
||||
/** Applique aux AAP la même règle d'ancienneté que pour la veille stratégique. */
|
||||
export async function purgeAapItemsOlderThan(months: number): Promise<number> {
|
||||
const db = await getDb();
|
||||
if (!db) throw new Error("Database not available");
|
||||
|
||||
const cutoff = cutoffForRetentionMonths(months);
|
||||
const where = sql`COALESCE(${aapItems.datePublication}, ${aapItems.importedAt}) <= ${cutoff}`;
|
||||
const items = await db.select({ id: aapItems.id }).from(aapItems).where(where);
|
||||
await removeArticleReadRecords("aap", items.map((item: { id: number }) => item.id));
|
||||
const result = await db.delete(aapItems).where(where);
|
||||
return (result as any).affectedRows ?? 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user