diff --git a/src/worker/character_creation.rs b/src/worker/character_creation.rs index 7a1ff49..ba636bc 100644 --- a/src/worker/character_creation.rs +++ b/src/worker/character_creation.rs @@ -464,7 +464,7 @@ impl CharacterCreationWorker { .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; conn.prepare("insert_notification", QUERY_INSERT_NOTIFICATION)?; - conn.execute("insert_notification", &[&user_id])?; + conn.execute("insert_notification", &[&user_id, &event_type])?; // falukantUpdateStatus let update_message = diff --git a/src/worker/user_character.rs b/src/worker/user_character.rs index df9a752..3ae2f16 100644 --- a/src/worker/user_character.rs +++ b/src/worker/user_character.rs @@ -36,6 +36,7 @@ use crate::worker::sql::{ QUERY_GET_PREGNANCY_CANDIDATES, QUERY_INSERT_CHILD, QUERY_INSERT_CHILD_RELATION, + QUERY_INSERT_NOTIFICATION, QUERY_DELETE_DIRECTOR, QUERY_DELETE_RELATIONSHIP, QUERY_DELETE_CHILD_RELATION, @@ -609,6 +610,26 @@ impl UserCharacterWorker { self.base.broker.publish(update_status); } + /// Wie `EventsWorker::notify_user`: Eintrag in `falukant_log.notification` (`tr` = event_type) + WS. + fn notify_user_death( + &self, + conn: &mut crate::db::DbConnection, + user_id: i32, + event_type: &str, + ) -> Result<(), DbError> { + if user_id <= 0 { + return Ok(()); + } + conn.execute("insert_notification", &[&user_id, &event_type])?; + let update_message = + format!(r#"{{"event":"falukantUpdateStatus","user_id":{}}}"#, user_id); + self.base.broker.publish(update_message); + let message = + format!(r#"{{"event":"{event_type}","user_id":{}}}"#, user_id); + self.base.broker.publish(message); + Ok(()) + } + // Todes- und Erb-Logik fn handle_character_death(&mut self, character_id: i32) -> Result<(), DbError> { self.set_heir(character_id)?; @@ -633,11 +654,44 @@ impl UserCharacterWorker { conn.prepare("delete_debtors_prism", QUERY_DELETE_DEBTORS_PRISM)?; conn.prepare("delete_political_office", QUERY_DELETE_POLITICAL_OFFICE)?; conn.prepare("delete_election_candidate", QUERY_DELETE_ELECTION_CANDIDATE)?; + conn.prepare("insert_notification", QUERY_INSERT_NOTIFICATION)?; + + let dir_result = conn.execute("delete_director", &[&character_id])?; + for row in dir_result { + if let Some(user_id) = row + .get("employer_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, user_id, "director_death")?; + } + } + + let rel_result = conn.execute("delete_relationship", &[&character_id])?; + for row in rel_result { + if let Some(related_user_id) = row + .get("related_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, related_user_id, "relationship_death")?; + } + } - conn.execute("delete_director", &[&character_id])?; - conn.execute("delete_relationship", &[&character_id])?; conn.execute("delete_child_relation_by_parent", &[&character_id])?; - conn.execute("delete_child_relation", &[&character_id])?; + let child_result = conn.execute("delete_child_relation", &[&character_id])?; + for row in child_result { + if let Some(father_user_id) = row + .get("father_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, father_user_id, "child_death")?; + } + if let Some(mother_user_id) = row + .get("mother_user_id") + .and_then(|v| v.parse::().ok()) + { + self.notify_user_death(&mut conn, mother_user_id, "child_death")?; + } + } conn.execute("delete_knowledge", &[&character_id])?; conn.execute("delete_debtors_prism", &[&character_id])?; conn.execute("delete_political_office", &[&character_id])?;