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.
This commit is contained in:
Torsten Schulz (local)
2026-03-05 00:00:07 +01:00
parent 37767e59a0
commit 92ae7d614e

View File

@@ -344,6 +344,30 @@ async fn load_user_gender(client: Arc<PgClient>, user_id: i32) -> Option<i32> {
return Some(mapped); 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<String> = 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 [ for query in [
"SELECT gender_restriction_id AS gender_id FROM community.\"user\" WHERE id = $1 LIMIT 1", "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", "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<PgClient>, user_id: i32) -> Option<i32> {
Ok(Some(row)) => { Ok(Some(row)) => {
let value: Option<i32> = row.try_get("gender_id").ok(); let value: Option<i32> = row.try_get("gender_id").ok();
if value.unwrap_or(0) > 0 { 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; return value;
} }
} }
@@ -380,6 +411,12 @@ async fn load_user_gender(client: Arc<PgClient>, user_id: i32) -> Option<i32> {
} }
} }
} }
if room_debug_enabled() {
eprintln!(
"[yourchat2][room-debug][gender-load] source=all user_id={} result=none",
user_id
);
}
None None
} }
@@ -400,7 +437,10 @@ async fn load_user_gender_from_user_param(client: Arc<PgClient>, user_id: i32) -
ON tpv_order.user_param_type_id = tp.id ON tpv_order.user_param_type_id = tp.id
AND tpv_order.order_id::text = up.value AND tpv_order.order_id::text = up.value
WHERE up.user_id = $1 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", LIMIT 1",
&[&user_id], &[&user_id],
) )
@@ -418,10 +458,22 @@ async fn load_user_gender_from_user_param(client: Arc<PgClient>, user_id: i32) -
] { ] {
if let Some(value) = candidate { if let Some(value) = candidate {
if let Some(parsed) = normalize_gender_value(value) { 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); 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 None
} }
@@ -573,6 +625,14 @@ fn normalize_gender_value(raw: &str) -> Option<i32> {
if let Ok(id) = trimmed.parse::<i32>() { if let Ok(id) = trimmed.parse::<i32>() {
return (id > 0).then_some(id); return (id > 0).then_some(id);
} }
let digits_only = trimmed.chars().filter(|c| c.is_ascii_digit()).collect::<String>();
if !digits_only.is_empty() {
if let Ok(id) = digits_only.parse::<i32>() {
if id > 0 {
return Some(id);
}
}
}
let (male_id, female_id) = configured_gender_ids(); let (male_id, female_id) = configured_gender_ids();
match trimmed.to_lowercase().as_str() { match trimmed.to_lowercase().as_str() {
"m" | "male" | "mann" | "männlich" | "maennlich" | "transmale" => Some(male_id), "m" | "male" | "mann" | "männlich" | "maennlich" | "transmale" => Some(male_id),
@@ -594,3 +654,10 @@ fn configured_gender_ids() -> (i32, i32) {
.unwrap_or(2); .unwrap_or(2);
(male_id, female_id) (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")
)
}