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") + ) +}