From 19bf3a9b2cf91e49af8c70f974a5b3fcf2bcd869 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 5 Feb 2026 23:34:24 +0900 Subject: feat(server): add purge mechanism for soft-deleted records Automatically removes soft-deleted records older than 90 days. Runs on server startup and every 24 hours thereafter. Respects foreign key dependencies when deleting. Co-Authored-By: Claude Opus 4.5 --- src/server/services/purge-scheduler.ts | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/server/services/purge-scheduler.ts (limited to 'src/server/services') diff --git a/src/server/services/purge-scheduler.ts b/src/server/services/purge-scheduler.ts new file mode 100644 index 0000000..6811593 --- /dev/null +++ b/src/server/services/purge-scheduler.ts @@ -0,0 +1,38 @@ +import { purgeRepository } from "../repositories/index.js"; + +const DEFAULT_RETENTION_DAYS = 90; +const PURGE_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours + +async function runPurge(): Promise { + try { + const result = await purgeRepository.purgeDeletedRecords({ + retentionDays: DEFAULT_RETENTION_DAYS, + }); + + const total = + result.reviewLogs + + result.noteFieldValues + + result.cards + + result.notes + + result.noteFieldTypes + + result.noteTypes + + result.decks; + + console.log(`[Purge] Completed: ${total} records deleted`); + if (total > 0) { + console.log( + `[Purge] Details: reviewLogs=${result.reviewLogs}, noteFieldValues=${result.noteFieldValues}, cards=${result.cards}, notes=${result.notes}, noteFieldTypes=${result.noteFieldTypes}, noteTypes=${result.noteTypes}, decks=${result.decks}`, + ); + } + } catch (error) { + console.error("[Purge] Failed:", error); + } +} + +export function startPurgeScheduler(): void { + // Run immediately on startup + runPurge(); + + // Schedule to run every 24 hours + setInterval(runPurge, PURGE_INTERVAL_MS); +} -- cgit v1.3-1-g0d28