Refactor SQL queries into centralized module

- Moved various SQL query strings from individual worker files into a new `sql.rs` module for better organization and reusability.
- Updated `events.rs`, `underground.rs`, and `weather.rs` to use the centralized SQL queries.
- Removed redundant query definitions from `events.rs`, `underground.rs`, and `weather.rs`.
This commit is contained in:
Torsten Schulz (local)
2025-12-12 15:18:30 +01:00
parent eab46f5cdc
commit a9d490ce38
7 changed files with 401 additions and 667 deletions

View File

@@ -8,6 +8,15 @@ use std::sync::Arc;
use std::time::{Duration, Instant};
use super::base::{BaseWorker, Worker, WorkerState};
use crate::worker::sql::{
QUERY_GET_RANDOM_USER,
QUERY_GET_RANDOM_INFANT,
QUERY_GET_RANDOM_CITY,
QUERY_GET_AFFECTED_USERS,
QUERY_INSERT_NOTIFICATION,
QUERY_GET_MONEY,
QUERY_UPDATE_MONEY,
};
/// Typisierung von Ereignissen
#[derive(Debug, Clone, Copy, PartialEq)]
@@ -420,15 +429,7 @@ impl EventsWorker {
return Self::trigger_sudden_infant_death(pool, broker, event, rng);
}
// Hole einen zufälligen aktiven Spieler
const QUERY_GET_RANDOM_USER: &str = r#"
SELECT id
FROM falukant_data.falukant_user
ORDER BY RANDOM()
LIMIT 1;
"#;
conn.prepare("get_random_user", QUERY_GET_RANDOM_USER)?;
conn.prepare("get_random_user", QUERY_GET_RANDOM_USER)?;
let rows = conn.execute("get_random_user", &[])?;
let user_id: Option<i32> = rows
@@ -604,20 +605,7 @@ impl EventsWorker {
// Finde ein zufälliges Kind unter 2 Jahren
// Maximalalter: 730 Tage (2 Jahre) - festgelegt in der WHERE-Klausel unten
const QUERY_GET_RANDOM_INFANT: &str = r#"
SELECT
c.id AS character_id,
c.user_id,
CURRENT_DATE - c.birthdate::date AS age_days
FROM falukant_data."character" c
WHERE c.user_id IS NOT NULL
AND c.health > 0
AND CURRENT_DATE - c.birthdate::date <= 730 -- Maximalalter: 2 Jahre (730 Tage)
ORDER BY RANDOM()
LIMIT 1;
"#;
conn.prepare("get_random_infant", QUERY_GET_RANDOM_INFANT)?;
conn.prepare("get_random_infant", QUERY_GET_RANDOM_INFANT)?;
let rows = conn.execute("get_random_infant", &[])?;
let character_id: Option<i32> = rows
@@ -712,16 +700,7 @@ impl EventsWorker {
.map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?;
// Hole eine zufällige Stadt-Region
const QUERY_GET_RANDOM_CITY: &str = r#"
SELECT 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'
ORDER BY RANDOM()
LIMIT 1;
"#;
conn.prepare("get_random_city", QUERY_GET_RANDOM_CITY)?;
conn.prepare("get_random_city", QUERY_GET_RANDOM_CITY)?;
let rows = conn.execute("get_random_city", &[])?;
let region_id: Option<i32> = rows
@@ -913,14 +892,7 @@ impl EventsWorker {
}
// Finde alle betroffenen User in dieser Region (User mit Branches)
const QUERY_GET_AFFECTED_USERS: &str = r#"
SELECT DISTINCT b.falukant_user_id AS user_id
FROM falukant_data.branch b
WHERE b.region_id = $1
AND b.falukant_user_id IS NOT NULL;
"#;
conn.prepare("get_affected_users", QUERY_GET_AFFECTED_USERS)?;
conn.prepare("get_affected_users", QUERY_GET_AFFECTED_USERS)?;
let user_rows = conn.execute("get_affected_users", &[&region_id])?;
// Sende Benachrichtigung an jeden betroffenen User einzeln
@@ -976,13 +948,7 @@ impl EventsWorker {
percent_change: f64,
) -> Result<f64, DbError> {
// Hole aktuelles Geld
const QUERY_GET_MONEY: &str = r#"
SELECT money
FROM falukant_data.falukant_user
WHERE id = $1;
"#;
conn.prepare("get_money", QUERY_GET_MONEY)?;
conn.prepare("get_money", QUERY_GET_MONEY)?;
let rows = conn.execute("get_money", &[&user_id])?;
let current_money: Option<f64> = rows
@@ -1002,12 +968,8 @@ impl EventsWorker {
let action = format!("Zufallsereignis: Geldänderung {:.2}%", percent_change);
// Verwende parametrisierte Queries für Sicherheit gegen SQL-Injection
const QUERY_UPDATE_MONEY: &str = r#"
SELECT falukant_data.update_money($1, $2, $3);
"#;
conn.prepare("update_money_event", QUERY_UPDATE_MONEY)?;
let _ = conn.execute("update_money_event", &[&user_id, &change, &action])?;
conn.prepare("update_money_event", QUERY_UPDATE_MONEY)?;
let _ = conn.execute("update_money_event", &[&user_id, &change, &action])?;
// Best-effort money_history insert for UI/history visibility.
let money_str = format!("{:.2}", change);
@@ -1811,17 +1773,7 @@ impl EventsWorker {
.get()
.map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?;
const QUERY_INSERT_NOTIFICATION: &str = r#"
INSERT INTO falukant_log.notification (
user_id,
tr,
shown,
created_at,
updated_at
) VALUES ($1, $2, FALSE, NOW(), NOW());
"#;
conn.prepare("insert_notification", QUERY_INSERT_NOTIFICATION)?;
conn.prepare("insert_notification", QUERY_INSERT_NOTIFICATION)?;
conn.execute("insert_notification", &[&user_id, &event_type])?;
// falukantUpdateStatus