38 lines
1.5 KiB
Rust
38 lines
1.5 KiB
Rust
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<User, DomainError> {
|
|
users.find_by_id(user_id).await?.ok_or(DomainError::NotFound)
|
|
}
|
|
|
|
pub async fn get_user_by_username(users: &dyn UserRepository, username: &str) -> Result<User, DomainError> {
|
|
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<String>,
|
|
bio: Option<String>,
|
|
avatar_url: Option<String>,
|
|
header_url: Option<String>,
|
|
custom_css: Option<String>,
|
|
) -> 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<Vec<(TopFriend, User)>, 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<UserId>) -> 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
|
|
}
|