From 92ae7d614ec6f7908a49465d2699ba9036eb582d Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 5 Mar 2026 00:00:07 +0100 Subject: [PATCH] Enhance user gender loading and debugging in database interactions Added additional queries to load user gender from both 'gender' and 'sex' columns, improving the accuracy of gender retrieval. Enhanced debug logging to provide detailed insights into gender loading processes, including raw values and mapped IDs. Updated the `normalize_gender_value` function to handle numeric gender representations, ensuring robust input normalization. This update strengthens gender handling in user interactions and improves troubleshooting capabilities. --- src/db.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/db.rs b/src/db.rs index e005905..86e1c6b 100644 --- a/src/db.rs +++ b/src/db.rs @@ -344,6 +344,30 @@ async fn load_user_gender(client: Arc, user_id: i32) -> Option { return Some(mapped); } + for query in [ + "SELECT gender::text AS gender_text FROM community.\"user\" WHERE id = $1 LIMIT 1", + "SELECT sex::text AS gender_text FROM community.\"user\" WHERE id = $1 LIMIT 1", + ] { + match client.query_opt(query, &[&user_id]).await { + Ok(Some(row)) => { + let value: Option = row.try_get("gender_text").ok(); + if let Some(value) = value { + if let Some(parsed) = normalize_gender_value(&value) { + if room_debug_enabled() { + eprintln!( + "[yourchat2][room-debug][gender-load] source=community.user:text-column user_id={} raw='{}' mapped_id={}", + user_id, value, parsed + ); + } + return Some(parsed); + } + } + } + Ok(None) => {} + Err(_) => {} + } + } + for query in [ "SELECT gender_restriction_id AS gender_id FROM community.\"user\" WHERE id = $1 LIMIT 1", "SELECT gender_type_id AS gender_id FROM community.\"user\" WHERE id = $1 LIMIT 1", @@ -354,6 +378,13 @@ async fn load_user_gender(client: Arc, user_id: i32) -> Option { Ok(Some(row)) => { let value: Option = row.try_get("gender_id").ok(); if value.unwrap_or(0) > 0 { + if room_debug_enabled() { + eprintln!( + "[yourchat2][room-debug][gender-load] source=community.user:id-column user_id={} mapped_id={}", + user_id, + value.unwrap_or_default() + ); + } return value; } } @@ -380,6 +411,12 @@ async fn load_user_gender(client: Arc, user_id: i32) -> Option { } } } + if room_debug_enabled() { + eprintln!( + "[yourchat2][room-debug][gender-load] source=all user_id={} result=none", + user_id + ); + } None } @@ -400,7 +437,10 @@ async fn load_user_gender_from_user_param(client: Arc, user_id: i32) - ON tpv_order.user_param_type_id = tp.id AND tpv_order.order_id::text = up.value WHERE up.user_id = $1 - AND tp.description = 'gender' + AND tp.description IN ('gender', 'sex', 'geschlecht') + AND up.value IS NOT NULL + AND btrim(up.value) <> '' + ORDER BY up.updated_at DESC, up.id DESC LIMIT 1", &[&user_id], ) @@ -418,10 +458,22 @@ async fn load_user_gender_from_user_param(client: Arc, user_id: i32) - ] { if let Some(value) = candidate { if let Some(parsed) = normalize_gender_value(value) { + if room_debug_enabled() { + eprintln!( + "[yourchat2][room-debug][gender-load] source=community.user_param user_id={} raw_value={:?} mapped_by_id={:?} mapped_by_order={:?} candidate='{}' mapped_id={}", + user_id, raw_value, mapped_by_id_value, mapped_by_order_value, value, parsed + ); + } return Some(parsed); } } } + if room_debug_enabled() { + eprintln!( + "[yourchat2][room-debug][gender-load] source=community.user_param user_id={} raw_value={:?} mapped_by_id={:?} mapped_by_order={:?} result=none", + user_id, raw_value, mapped_by_id_value, mapped_by_order_value + ); + } None } @@ -573,6 +625,14 @@ fn normalize_gender_value(raw: &str) -> Option { if let Ok(id) = trimmed.parse::() { return (id > 0).then_some(id); } + let digits_only = trimmed.chars().filter(|c| c.is_ascii_digit()).collect::(); + if !digits_only.is_empty() { + if let Ok(id) = digits_only.parse::() { + if id > 0 { + return Some(id); + } + } + } let (male_id, female_id) = configured_gender_ids(); match trimmed.to_lowercase().as_str() { "m" | "male" | "mann" | "männlich" | "maennlich" | "transmale" => Some(male_id), @@ -594,3 +654,10 @@ fn configured_gender_ids() -> (i32, i32) { .unwrap_or(2); (male_id, female_id) } + +fn room_debug_enabled() -> bool { + matches!( + env::var("CHAT_DEBUG_ROOM_ACCESS").ok().as_deref(), + Some("1") | Some("true") | Some("TRUE") | Some("yes") | Some("YES") | Some("on") | Some("ON") + ) +}