use common::DateTimeWithTimeZoneWrapper; use serde::Serialize; use utoipa::ToSchema; use uuid::Uuid; use crate::domains::user; #[derive(Serialize, ToSchema)] #[serde(rename_all = "camelCase")] pub struct UserSchema { pub id: Uuid, pub username: String, pub display_name: Option, pub bio: Option, pub avatar_url: Option, pub header_url: Option, pub custom_css: Option, pub top_friends: Vec, pub joined_at: DateTimeWithTimeZoneWrapper, } impl From<(user::Model, Vec)> for UserSchema { fn from((user, top_friends): (user::Model, Vec)) -> Self { Self { id: user.id, username: user.username, display_name: user.display_name, bio: user.bio, avatar_url: user.avatar_url, header_url: user.header_url, custom_css: user.custom_css, top_friends: top_friends.into_iter().map(|u| u.username).collect(), joined_at: user.created_at.into(), } } } impl From for UserSchema { fn from(user: user::Model) -> Self { Self { id: user.id, username: user.username, display_name: user.display_name, bio: user.bio, avatar_url: user.avatar_url, header_url: user.header_url, custom_css: user.custom_css, top_friends: vec![], joined_at: user.created_at.into(), } } } #[derive(Serialize, ToSchema)] pub struct UserListSchema { pub users: Vec, } impl From> for UserListSchema { fn from(users: Vec) -> Self { Self { users: users.into_iter().map(UserSchema::from).collect(), } } } #[derive(Serialize, ToSchema)] #[serde(rename_all = "camelCase")] pub struct MeSchema { pub id: Uuid, pub username: String, pub display_name: Option, pub bio: Option, pub avatar_url: Option, pub header_url: Option, pub custom_css: Option, pub top_friends: Vec, pub joined_at: DateTimeWithTimeZoneWrapper, pub following: Vec, }