Refactor money update execution in BaseWorker: Simplified the SQL execution by directly constructing the update query without parameterized placeholders, addressing serialization issues. Updated comments for clarity on the handling of money values and ensured compatibility with trusted data sources. Additionally, modified the casting of money in the director query to text for consistent mapping in Rust.

This commit is contained in:
Torsten Schulz (local)
2025-12-01 11:31:37 +01:00
parent 260b3b2962
commit a0e14788c7
2 changed files with 12 additions and 23 deletions

View File

@@ -127,18 +127,6 @@ impl BaseWorker {
// Bei Bedarf kann hier später wieder ein expliziter Statuszugriff ergänzt werden.
}
// Hinweis: In der bestehenden Datenbank ist `falukant_data.update_money` typischerweise
// so definiert, dass der Geldbetrag als NUMERIC erwartet wird. Wir übergeben
// die Parameter ohne explizite Casts; PostgreSQL castet sie anhand der
// Funktionssignatur automatisch.
const QUERY_UPDATE_MONEY: &str = r#"
SELECT falukant_data.update_money(
$1,
$2,
$3
);
"#;
impl BaseWorker {
/// Aktualisiert das Geld eines Falukant-Users über die DB-Funktion `falukant_data.update_money`.
/// `action` entspricht dem Log-/Aktions-Tag (z.B. "credit pay rate", "debitor_prism").
@@ -153,13 +141,15 @@ impl BaseWorker {
.get()
.map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?;
// Statement einmalig registrieren und anschließend über den Namen
// ausführen analog zum restlichen Code.
conn.prepare("update_money", QUERY_UPDATE_MONEY)?;
// Parameter werden in ihren natürlichen Typen übergeben; PostgreSQL
// wählt anhand der Funktionssignatur die passenden Zieltypen.
let money_str = money_change.to_string(); // NUMERIC erwartet String-Repräsentation
conn.execute("update_money", &[&falukant_user_id, &money_str, &action])?;
// Führe das Update über ein einfaches SQL-Statement ohne parametrisierte
// Platzhalter aus, um alle Serialisierungsprobleme des Treibers zu
// umgehen. Alle Werte stammen aus vertrauenswürdigen Quellen.
let escaped_action = action.replace('\'', "''");
let sql = format!(
"SELECT falukant_data.update_money({},{},'{}');",
falukant_user_id, money_change, escaped_action
);
let _ = conn.query(&sql)?;
Ok(())
}