From d94fa791b39a8a5385034f22e279adf448288157 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 4 Feb 2026 14:46:57 +0100 Subject: [PATCH] Add child relation deletion by parent query: Introduced a new SQL query to delete child relations where the character is either a father or mother. Updated relevant workers to execute this query before deleting child relations, ensuring proper cleanup of relationships during character deletion. --- YpDaemon/src/worker/character_creation.rs | 5 ++++- YpDaemon/src/worker/events.rs | 7 +++++-- YpDaemon/src/worker/sql.rs | 5 +++++ YpDaemon/src/worker/user_character.rs | 3 +++ src/worker/character_creation.rs | 5 ++++- src/worker/events.rs | 7 +++++-- src/worker/sql.rs | 5 +++++ src/worker/user_character.rs | 3 +++ 8 files changed, 34 insertions(+), 6 deletions(-) diff --git a/YpDaemon/src/worker/character_creation.rs b/YpDaemon/src/worker/character_creation.rs index 704338a..7a1ff49 100644 --- a/YpDaemon/src/worker/character_creation.rs +++ b/YpDaemon/src/worker/character_creation.rs @@ -20,6 +20,7 @@ use crate::worker::sql::{ QUERY_DELETE_DIRECTOR, QUERY_DELETE_RELATIONSHIP, QUERY_DELETE_CHILD_RELATION, + QUERY_DELETE_CHILD_RELATION_BY_PARENT, QUERY_INSERT_NOTIFICATION, QUERY_MARK_CHARACTER_DECEASED, }; @@ -426,7 +427,9 @@ impl CharacterCreationWorker { } } - // 3) Child-Relations löschen und Eltern benachrichtigen + // 3) Child-Relations löschen (als Elter zuerst, dann als Kind) und Eltern benachrichtigen + conn.prepare("delete_child_relation_by_parent", QUERY_DELETE_CHILD_RELATION_BY_PARENT)?; + conn.execute("delete_child_relation_by_parent", &[&character_id])?; conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; let child_result = conn.execute("delete_child_relation", &[&character_id])?; for row in child_result { diff --git a/YpDaemon/src/worker/events.rs b/YpDaemon/src/worker/events.rs index 1329e8d..0a672bf 100644 --- a/YpDaemon/src/worker/events.rs +++ b/YpDaemon/src/worker/events.rs @@ -43,6 +43,7 @@ use crate::worker::sql::{ QUERY_DELETE_RELATIONSHIP, QUERY_GET_USER_ID, QUERY_DELETE_CHILD_RELATION, + QUERY_DELETE_CHILD_RELATION_BY_PARENT, QUERY_DELETE_CHARACTER, QUERY_GET_HEIR, QUERY_SET_CHARACTER_USER, @@ -1460,8 +1461,10 @@ impl EventsWorker { Self::handle_inheritance(pool, broker, &mut conn, character_id, falukant_user_id)?; } - // 4) Child-Relations löschen und Eltern benachrichtigen - conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; + // 4) Child-Relations löschen (als Elter zuerst, dann als Kind) und Eltern benachrichtigen + conn.prepare("delete_child_relation_by_parent", QUERY_DELETE_CHILD_RELATION_BY_PARENT)?; + conn.execute("delete_child_relation_by_parent", &[&character_id])?; + conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; let child_result = conn.execute("delete_child_relation", &[&character_id])?; for row in child_result { if let Some(father_user_id) = row diff --git a/YpDaemon/src/worker/sql.rs b/YpDaemon/src/worker/sql.rs index 0fdab0f..5a33d8f 100644 --- a/YpDaemon/src/worker/sql.rs +++ b/YpDaemon/src/worker/sql.rs @@ -544,6 +544,11 @@ WITH deleted AS ( SELECT cf.user_id AS father_user_id, cm.user_id AS mother_user_id FROM deleted d JOIN falukant_data.character cf ON cf.id = d.father_character_id JOIN falukant_data.character cm ON cm.id = d.mother_character_id; "#; +/// Entfernt alle child_relation-Zeilen, in denen der Charakter Vater oder Mutter ist (nötig vor Charakter-Löschung). +pub const QUERY_DELETE_CHILD_RELATION_BY_PARENT: &str = r#" +DELETE FROM falukant_data.child_relation WHERE father_character_id = $1 OR mother_character_id = $1; +"#; + pub const QUERY_DELETE_CHARACTER: &str = r#" DELETE FROM falukant_data.character WHERE id = $1; "#; diff --git a/YpDaemon/src/worker/user_character.rs b/YpDaemon/src/worker/user_character.rs index 01428d1..0838724 100644 --- a/YpDaemon/src/worker/user_character.rs +++ b/YpDaemon/src/worker/user_character.rs @@ -38,6 +38,7 @@ use crate::worker::sql::{ QUERY_DELETE_DIRECTOR, QUERY_DELETE_RELATIONSHIP, QUERY_DELETE_CHILD_RELATION, + QUERY_DELETE_CHILD_RELATION_BY_PARENT, QUERY_DELETE_KNOWLEDGE, QUERY_DELETE_DEBTORS_PRISM, QUERY_DELETE_POLITICAL_OFFICE, @@ -576,6 +577,7 @@ impl UserCharacterWorker { conn.prepare("delete_director", QUERY_DELETE_DIRECTOR)?; conn.prepare("delete_relationship", QUERY_DELETE_RELATIONSHIP)?; conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; + conn.prepare("delete_child_relation_by_parent", QUERY_DELETE_CHILD_RELATION_BY_PARENT)?; conn.prepare("delete_knowledge", QUERY_DELETE_KNOWLEDGE)?; conn.prepare("delete_debtors_prism", QUERY_DELETE_DEBTORS_PRISM)?; conn.prepare("delete_political_office", QUERY_DELETE_POLITICAL_OFFICE)?; @@ -583,6 +585,7 @@ impl UserCharacterWorker { 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])?; conn.execute("delete_knowledge", &[&character_id])?; conn.execute("delete_debtors_prism", &[&character_id])?; diff --git a/src/worker/character_creation.rs b/src/worker/character_creation.rs index 704338a..7a1ff49 100644 --- a/src/worker/character_creation.rs +++ b/src/worker/character_creation.rs @@ -20,6 +20,7 @@ use crate::worker::sql::{ QUERY_DELETE_DIRECTOR, QUERY_DELETE_RELATIONSHIP, QUERY_DELETE_CHILD_RELATION, + QUERY_DELETE_CHILD_RELATION_BY_PARENT, QUERY_INSERT_NOTIFICATION, QUERY_MARK_CHARACTER_DECEASED, }; @@ -426,7 +427,9 @@ impl CharacterCreationWorker { } } - // 3) Child-Relations löschen und Eltern benachrichtigen + // 3) Child-Relations löschen (als Elter zuerst, dann als Kind) und Eltern benachrichtigen + conn.prepare("delete_child_relation_by_parent", QUERY_DELETE_CHILD_RELATION_BY_PARENT)?; + conn.execute("delete_child_relation_by_parent", &[&character_id])?; conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; let child_result = conn.execute("delete_child_relation", &[&character_id])?; for row in child_result { diff --git a/src/worker/events.rs b/src/worker/events.rs index 96cc4e2..c9dd608 100644 --- a/src/worker/events.rs +++ b/src/worker/events.rs @@ -43,6 +43,7 @@ use crate::worker::sql::{ QUERY_DELETE_RELATIONSHIP, QUERY_GET_USER_ID, QUERY_DELETE_CHILD_RELATION, + QUERY_DELETE_CHILD_RELATION_BY_PARENT, QUERY_DELETE_CHARACTER, QUERY_GET_HEIR, QUERY_SET_CHARACTER_USER, @@ -1486,8 +1487,10 @@ impl EventsWorker { Self::handle_inheritance(pool, broker, &mut conn, character_id, falukant_user_id)?; } - // 4) Child-Relations löschen und Eltern benachrichtigen - conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; + // 4) Child-Relations löschen (als Elter zuerst, dann als Kind) und Eltern benachrichtigen + conn.prepare("delete_child_relation_by_parent", QUERY_DELETE_CHILD_RELATION_BY_PARENT)?; + conn.execute("delete_child_relation_by_parent", &[&character_id])?; + conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; let child_result = conn.execute("delete_child_relation", &[&character_id])?; for row in child_result { if let Some(father_user_id) = row diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 0fab301..ed74338 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -544,6 +544,11 @@ WITH deleted AS ( SELECT cf.user_id AS father_user_id, cm.user_id AS mother_user_id FROM deleted d JOIN falukant_data.character cf ON cf.id = d.father_character_id JOIN falukant_data.character cm ON cm.id = d.mother_character_id; "#; +/// Entfernt alle child_relation-Zeilen, in denen der Charakter Vater oder Mutter ist (nötig vor Charakter-Löschung). +pub const QUERY_DELETE_CHILD_RELATION_BY_PARENT: &str = r#" +DELETE FROM falukant_data.child_relation WHERE father_character_id = $1 OR mother_character_id = $1; +"#; + pub const QUERY_DELETE_CHARACTER: &str = r#" DELETE FROM falukant_data.character WHERE id = $1; "#; diff --git a/src/worker/user_character.rs b/src/worker/user_character.rs index 1c20f2d..3b0b6ee 100644 --- a/src/worker/user_character.rs +++ b/src/worker/user_character.rs @@ -39,6 +39,7 @@ use crate::worker::sql::{ QUERY_DELETE_DIRECTOR, QUERY_DELETE_RELATIONSHIP, QUERY_DELETE_CHILD_RELATION, + QUERY_DELETE_CHILD_RELATION_BY_PARENT, QUERY_DELETE_KNOWLEDGE, QUERY_DELETE_DEBTORS_PRISM, QUERY_DELETE_POLITICAL_OFFICE, @@ -625,6 +626,7 @@ impl UserCharacterWorker { conn.prepare("delete_director", QUERY_DELETE_DIRECTOR)?; conn.prepare("delete_relationship", QUERY_DELETE_RELATIONSHIP)?; conn.prepare("delete_child_relation", QUERY_DELETE_CHILD_RELATION)?; + conn.prepare("delete_child_relation_by_parent", QUERY_DELETE_CHILD_RELATION_BY_PARENT)?; conn.prepare("delete_knowledge", QUERY_DELETE_KNOWLEDGE)?; conn.prepare("delete_debtors_prism", QUERY_DELETE_DEBTORS_PRISM)?; conn.prepare("delete_political_office", QUERY_DELETE_POLITICAL_OFFICE)?; @@ -632,6 +634,7 @@ impl UserCharacterWorker { 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])?; conn.execute("delete_knowledge", &[&character_id])?; conn.execute("delete_debtors_prism", &[&character_id])?;