use domain::{ errors::DomainError, models::{top_friend::TopFriend, user::User}, ports::{TopFriendRepository, UserRepository}, value_objects::{UserId, Username}, }; pub async fn get_user(users: &dyn UserRepository, user_id: &UserId) -> Result { users.find_by_id(user_id).await?.ok_or(DomainError::NotFound) } pub async fn get_user_by_username(users: &dyn UserRepository, username: &str) -> Result { let username = Username::from_trusted(username.to_string()); users.find_by_username(&username).await?.ok_or(DomainError::NotFound) } pub async fn update_profile( users: &dyn UserRepository, user_id: &UserId, display_name: Option, bio: Option, avatar_url: Option, header_url: Option, custom_css: Option, ) -> Result<(), DomainError> { users.update_profile(user_id, display_name, bio, avatar_url, header_url, custom_css).await } pub async fn get_top_friends(top_friends: &dyn TopFriendRepository, user_id: &UserId) -> Result, DomainError> { top_friends.list_for_user(user_id).await } pub async fn set_top_friends(top_friends: &dyn TopFriendRepository, user_id: &UserId, friend_ids: Vec) -> Result<(), DomainError> { if friend_ids.len() > 8 { return Err(DomainError::InvalidInput("top friends: max 8".into())); } let friends: Vec<(UserId, i16)> = friend_ids.into_iter().enumerate().map(|(i, id)| (id, (i + 1) as i16)).collect(); top_friends.set_top_friends(user_id, friends).await }