use module_auth::AuthUser; use crate::state::AppState; #[derive(Clone, Debug, PartialEq, Eq)] pub struct WorkAuthorSummary { pub display_name: String, pub public_user_code: Option, } /// 中文注释:作品作者的真相源是 owner_user_id;历史昵称字段只作为账号资料不可读时的兼容回退。 pub fn resolve_work_author_by_user_id( state: &AppState, owner_user_id: &str, fallback_display_name: Option<&str>, fallback_public_user_code: Option<&str>, ) -> WorkAuthorSummary { let fallback_display_name = normalize_optional_text(fallback_display_name).unwrap_or_else(|| "玩家".to_string()); let fallback_public_user_code = normalize_optional_text(fallback_public_user_code); let Some(owner_user_id) = normalize_optional_text(Some(owner_user_id)) else { return WorkAuthorSummary { display_name: fallback_display_name, public_user_code: fallback_public_user_code, }; }; match state.auth_user_service().get_user_by_id(&owner_user_id) { Ok(Some(user)) => map_auth_user_to_work_author_summary(user, fallback_display_name), Ok(None) | Err(_) => WorkAuthorSummary { display_name: fallback_display_name, public_user_code: fallback_public_user_code, }, } } fn map_auth_user_to_work_author_summary( user: AuthUser, fallback_display_name: String, ) -> WorkAuthorSummary { WorkAuthorSummary { display_name: normalize_optional_text(Some(user.display_name.as_str())) .unwrap_or(fallback_display_name), public_user_code: normalize_optional_text(Some(user.public_user_code.as_str())), } } fn normalize_optional_text(value: Option<&str>) -> Option { value .map(str::trim) .filter(|value| !value.is_empty()) .map(ToOwned::to_owned) }