From 7305a71438ac762d0aa45c6c4db142945f2d72be Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 22 Jan 2026 09:35:21 +0100 Subject: [PATCH] Enhance relationship deletion process in character management: Implement detailed logging for deleted relationships, including related user and character IDs, and relationship types. Introduce special notifications for engaged relationships to improve user awareness during character events. --- src/worker/character_creation.rs | 36 ++++++++++++++++++++++++--- src/worker/events.rs | 34 +++++++++++++++++++++++--- src/worker/sql.rs | 13 ++++++++-- src/worker/user_character.rs | 42 +++++++++++++++++++++++++++++++- 4 files changed, 114 insertions(+), 11 deletions(-) diff --git a/src/worker/character_creation.rs b/src/worker/character_creation.rs index adc0834..ee7d96b 100644 --- a/src/worker/character_creation.rs +++ b/src/worker/character_creation.rs @@ -3,6 +3,7 @@ use crate::message_broker::MessageBroker; use rand::distributions::{Distribution, Uniform}; use rand::rngs::StdRng; use rand::{thread_rng, Rng, SeedableRng}; +use serde_json::json; use std::collections::{HashMap, HashSet}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; @@ -418,11 +419,38 @@ impl CharacterCreationWorker { conn.prepare("delete_relationship", QUERY_DELETE_RELATIONSHIP)?; let rel_result = conn.execute("delete_relationship", &[&character_id])?; for row in rel_result { - if let Some(related_user_id) = row + let related_user_id = row .get("related_user_id") - .and_then(|v| v.parse::().ok()) - { - Self::notify_user(pool, broker, related_user_id, "relationship_death")?; + .and_then(|v| v.parse::().ok()); + let related_character_id = row + .get("related_character_id") + .and_then(|v| v.parse::().ok()); + let relationship_type_tr = row + .get("relationship_type_tr") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + + // Logging: Relationship wurde gelöscht + eprintln!( + "[CharacterCreationWorker] Relationship gelöscht: character_id={}, related_character_id={}, related_user_id={:?}, relationship_type={:?}", + character_id, + related_character_id.unwrap_or(-1), + related_user_id, + relationship_type_tr + ); + + if let Some(uid) = related_user_id { + // Spezielle Notification für Verlobungen + if relationship_type_tr.as_deref() == Some("engaged") { + use crate::worker::insert_notification; + let notification_json = serde_json::json!({ + "tr": "relationship.engaged_character_death", + "character_id": related_character_id + }); + insert_notification(pool, uid, ¬ification_json.to_string(), related_character_id)?; + } else { + Self::notify_user(pool, broker, uid, "relationship_death")?; + } } } diff --git a/src/worker/events.rs b/src/worker/events.rs index 91ece80..f1f4d95 100644 --- a/src/worker/events.rs +++ b/src/worker/events.rs @@ -1779,11 +1779,37 @@ impl EventsWorker { conn.prepare("delete_relationship", QUERY_DELETE_RELATIONSHIP)?; let rel_result = conn.execute("delete_relationship", &[&character_id])?; for row in rel_result { - if let Some(related_user_id) = row + let related_user_id = row .get("related_user_id") - .and_then(|v| v.parse::().ok()) - { - Self::notify_user(pool, broker, related_user_id, "relationship_death", None)?; + .and_then(|v| v.parse::().ok()); + let related_character_id = row + .get("related_character_id") + .and_then(|v| v.parse::().ok()); + let relationship_type_tr = row + .get("relationship_type_tr") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + + // Logging: Relationship wurde gelöscht + eprintln!( + "[EventsWorker] Relationship gelöscht: character_id={}, related_character_id={}, related_user_id={:?}, relationship_type={:?}", + character_id, + related_character_id.unwrap_or(-1), + related_user_id, + relationship_type_tr + ); + + if let Some(uid) = related_user_id { + // Spezielle Notification für Verlobungen + if relationship_type_tr.as_deref() == Some("engaged") { + let notification_json = serde_json::json!({ + "tr": "relationship.engaged_character_death", + "character_id": related_character_id + }); + Self::notify_user(pool, broker, uid, ¬ification_json.to_string(), related_character_id)?; + } else { + Self::notify_user(pool, broker, uid, "relationship_death", None)?; + } } } diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 5cd82de..488bd52 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -726,9 +726,18 @@ pub const QUERY_DELETE_RELATIONSHIP: &str = r#" WITH deleted AS ( DELETE FROM falukant_data.relationship WHERE character1_id = $1 OR character2_id = $1 - RETURNING CASE WHEN character1_id = $1 THEN character2_id ELSE character1_id END AS related_character_id, relationship_type_id + RETURNING + CASE WHEN character1_id = $1 THEN character2_id ELSE character1_id END AS related_character_id, + relationship_type_id ) -SELECT c.user_id AS related_user_id FROM deleted d JOIN falukant_data.character c ON c.id = d.related_character_id; +SELECT + c.user_id AS related_user_id, + d.related_character_id, + d.relationship_type_id, + rt.tr AS relationship_type_tr +FROM deleted d +JOIN falukant_data.character c ON c.id = d.related_character_id +LEFT JOIN falukant_type.relationship rt ON rt.id = d.relationship_type_id; "#; pub const QUERY_GET_USER_ID: &str = r#" diff --git a/src/worker/user_character.rs b/src/worker/user_character.rs index 3d8026c..0fd8118 100644 --- a/src/worker/user_character.rs +++ b/src/worker/user_character.rs @@ -3,6 +3,7 @@ use crate::message_broker::MessageBroker; use rand::distributions::{Distribution, Uniform}; use rand::rngs::StdRng; use rand::SeedableRng; +use serde_json::json; use std::sync::atomic::Ordering; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -578,7 +579,46 @@ impl UserCharacterWorker { conn.prepare("delete_election_candidate", QUERY_DELETE_ELECTION_CANDIDATE)?; conn.execute("delete_director", &[&character_id])?; - conn.execute("delete_relationship", &[&character_id])?; + + // Relationships löschen mit Logging und spezieller Notification für Verlobungen + let rel_result = conn.execute("delete_relationship", &[&character_id])?; + for row in rel_result { + let related_user_id = row + .get("related_user_id") + .and_then(|v| v.parse::().ok()); + let related_character_id = row + .get("related_character_id") + .and_then(|v| v.parse::().ok()); + let relationship_type_tr = row + .get("relationship_type_tr") + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + + // Logging: Relationship wurde gelöscht + eprintln!( + "[UserCharacterWorker] Relationship gelöscht: character_id={}, related_character_id={}, related_user_id={:?}, relationship_type={:?}", + character_id, + related_character_id.unwrap_or(-1), + related_user_id, + relationship_type_tr + ); + + if let Some(uid) = related_user_id { + use crate::worker::insert_notification; + // Spezielle Notification für Verlobungen + if relationship_type_tr.as_deref() == Some("engaged") { + let notification_json = serde_json::json!({ + "tr": "relationship.engaged_character_death", + "character_id": related_character_id + }); + insert_notification(&self.base.pool, uid, ¬ification_json.to_string(), related_character_id)?; + } else { + use crate::worker::insert_notification; + insert_notification(&self.base.pool, uid, "relationship_death", None)?; + } + } + } + conn.execute("delete_child_relation", &[&character_id])?; conn.execute("delete_knowledge", &[&character_id])?; conn.execute("delete_debtors_prism", &[&character_id])?;