From 0083d7be2329ad533dccff0acc7053aa935177e9 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 15 Jan 2026 13:45:31 +0100 Subject: [PATCH] Add daily cleanup of old notifications in EventsWorker: Implement a new method to delete notifications older than 30 days, enhancing database management and reducing clutter. Update run loop to trigger this cleanup daily, ensuring timely maintenance of notification records. --- src/worker/events.rs | 30 +++++++++++++++++++++++++++--- src/worker/sql.rs | 6 ++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/worker/events.rs b/src/worker/events.rs index fe2e05b..b940ef2 100644 --- a/src/worker/events.rs +++ b/src/worker/events.rs @@ -402,6 +402,7 @@ impl EventsWorker { fn run_loop(pool: ConnectionPool, broker: MessageBroker, state: Arc) { let mut last_event_check = None; + let mut last_notification_cleanup: Option = None; let mut rng = rand::thread_rng(); let events = Self::initialize_events(); eprintln!("[EventsWorker] Worker-Thread gestartet"); @@ -414,7 +415,6 @@ impl EventsWorker { let now = Instant::now(); // Heartbeat im Run-Loop (unabhängig davon, ob Events triggern) - // Damit man sofort sieht, ob der Worker überhaupt läuft. static LAST_RUNLOOP_HEARTBEAT: Mutex> = Mutex::new(None); { let mut last = LAST_RUNLOOP_HEARTBEAT.lock().unwrap(); @@ -441,8 +441,13 @@ impl EventsWorker { last_event_check = Some(now); } - // 10-Sekunden-Wartezeit in kurze Scheiben aufteilen, damit ein Shutdown - // (running_worker = false) schnell greift. + // Alte Notifications einmal täglich aufräumen (alle 24 Stunden) + if should_run_interval(last_notification_cleanup, now, Duration::from_secs(86400)) { + Self::cleanup_old_notifications(&pool); + last_notification_cleanup = Some(now); + } + + // 10-Sekunden-Wartezeit in kurze Scheiben aufteilen const SLICE_MS: u64 = 500; let total_ms = 10_000; let mut slept = 0; @@ -458,6 +463,25 @@ impl EventsWorker { } } + fn cleanup_old_notifications(pool: &ConnectionPool) { + use crate::worker::sql::QUERY_DELETE_OLD_NOTIFICATIONS; + + let result = (|| -> Result<(), DbError> { + let mut conn = pool + .get() + .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; + + conn.prepare("delete_old_notifications", QUERY_DELETE_OLD_NOTIFICATIONS)?; + conn.execute("delete_old_notifications", &[])?; + Ok(()) + })(); + + match result { + Ok(()) => eprintln!("[EventsWorker] Alte Notifications (>30 Tage) aufgeräumt"), + Err(err) => eprintln!("[EventsWorker] Fehler beim Aufräumen alter Notifications: {err}"), + } + } + // Globaler Skalierungsfaktor für Ereignisfrequenz. // Default: 1.0 (unverändert). Optional per ENV `EVENT_RATE_SCALE` konfigurierbar. fn event_rate_scale() -> f64 { diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 651b263..5cd82de 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -71,6 +71,12 @@ pub const QUERY_INSERT_NOTIFICATION_FULL: &str = r#" ) VALUES ($1, $2, $3, FALSE, NOW(), NOW()); "#; +/// Löscht alte Notifications (älter als 30 Tage) +pub const QUERY_DELETE_OLD_NOTIFICATIONS: &str = r#" + DELETE FROM falukant_log.notification + WHERE created_at < NOW() - INTERVAL '30 days'; +"#; + // Product pricing pub const QUERY_GET_PRODUCT_COST: &str = r#" SELECT sell_cost, sell_cost AS original_sell_cost FROM falukant_type.product WHERE id = $1;