aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/services/purge-scheduler.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-05 23:34:24 +0900
committernsfisis <nsfisis@gmail.com>2026-02-05 23:34:24 +0900
commit19bf3a9b2cf91e49af8c70f974a5b3fcf2bcd869 (patch)
tree591fde02774492b90c8219cb389dd318178e54f5 /src/server/services/purge-scheduler.ts
parent504ff72fea72eb3d7c4cf45be1bd9620cb12a796 (diff)
downloadkioku-19bf3a9b2cf91e49af8c70f974a5b3fcf2bcd869.tar.gz
kioku-19bf3a9b2cf91e49af8c70f974a5b3fcf2bcd869.tar.zst
kioku-19bf3a9b2cf91e49af8c70f974a5b3fcf2bcd869.zip
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 <noreply@anthropic.com>
Diffstat (limited to 'src/server/services/purge-scheduler.ts')
-rw-r--r--src/server/services/purge-scheduler.ts38
1 files changed, 38 insertions, 0 deletions
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<void> {
+ 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);
+}