diff --git a/src/worker/base.rs b/src/worker/base.rs index 1cc569f..bea48bd 100644 --- a/src/worker/base.rs +++ b/src/worker/base.rs @@ -97,7 +97,6 @@ impl BaseWorker { } let state = Arc::clone(&self.state); - let name = self.name.clone(); self.watchdog_thread = Some(thread::spawn(move || { while state.running_watchdog.load(Ordering::Relaxed) { diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 1c8a585..8b7f79b 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -257,11 +257,6 @@ pub const QUERY_DELETE_TRANSPORT: &str = r#" DELETE FROM falukant_data.transport WHERE id = $1; "#; -pub const QUERY_ADD_TRANSPORT_WAITING_NOTIFICATION: &str = r#" -INSERT INTO falukant_log.notification (user_id, tr, shown, created_at, updated_at) -VALUES ((SELECT c.user_id FROM falukant_data.character c WHERE c.user_id = $1 LIMIT 1), $2, FALSE, NOW(), NOW()); -"#; - pub const QUERY_UPDATE_TRANSPORT_SIZE: &str = r#" UPDATE falukant_data.transport SET size = $2, diff --git a/src/worker/weather.rs b/src/worker/weather.rs index 5dbe9db..e9a7dc8 100644 --- a/src/worker/weather.rs +++ b/src/worker/weather.rs @@ -5,13 +5,38 @@ use std::sync::Arc; use std::time::{Duration, Instant}; use super::base::{BaseWorker, Worker, WorkerState}; -use crate::worker::sql::QUERY_UPDATE_WEATHER; pub struct WeatherWorker { base: BaseWorker, } -// Reuse QUERY_UPDATE_WEATHER from centralized SQL module +// Query zum Aktualisieren des Wetters für alle Regionen +// Wählt für jede Region ein zufälliges Wetter aus allen verfügbaren Wettertypen aus +// Wichtig: Jede Region bekommt ein individuelles, zufälliges Wetter +const QUERY_UPDATE_WEATHER: &str = r#" + WITH all_regions AS ( + SELECT DISTINCT r.id AS region_id + FROM falukant_data.region r + JOIN falukant_type.region tr ON r.region_type_id = tr.id + WHERE tr.label_tr = 'city' + ), + random_weather AS ( + SELECT + ar.region_id, + ( + SELECT wt.id + FROM falukant_type.weather wt + ORDER BY RANDOM() + LIMIT 1 + ) AS weather_type_id + FROM all_regions ar + ) + INSERT INTO falukant_data.weather (region_id, weather_type_id) + SELECT rw.region_id, rw.weather_type_id + FROM random_weather rw + ON CONFLICT (region_id) + DO UPDATE SET weather_type_id = EXCLUDED.weather_type_id; +"#; impl WeatherWorker { pub fn new(pool: ConnectionPool, broker: MessageBroker) -> Self { @@ -63,17 +88,17 @@ impl WeatherWorker { .get() .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; - // Run the prepared SQL that uses per-row RANDOM() trick conn.prepare("update_weather", QUERY_UPDATE_WEATHER)?; let updated_rows = conn.execute("update_weather", &[])?; eprintln!( - "[WeatherWorker] Wetter aktualisiert (per-row random). {} Regionen betroffen.", + "[WeatherWorker] Wetter aktualisiert. {} Regionen betroffen.", updated_rows.len() ); // Benachrichtige alle Clients über Wetteränderungen - broker.publish("{\"event\":\"weather_updated\"}".to_string()); + let message = r#"{"event":"weather_updated"}"#; + broker.publish(message.to_string()); Ok(()) }