use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use super::{Relationship, UserCounts, UserDetails};
use crate::models::tag::traits::TagCollection;
use crate::models::tag::user::TagUser;
use crate::models::tag::TagDetails;
use crate::types::DynError;
#[derive(Serialize, Deserialize, ToSchema, Default, Debug)]
pub struct UserView {
pub details: UserDetails,
pub counts: UserCounts,
pub tags: Vec<TagDetails>,
pub relationship: Relationship,
}
impl UserView {
pub async fn get_by_id(
user_id: &str,
viewer_id: Option<&str>,
depth: Option<u8>,
) -> Result<Option<Self>, DynError> {
let (details, counts, relationship) = tokio::try_join!(
UserDetails::get_by_id(user_id),
UserCounts::get_by_id(user_id),
Relationship::get_by_id(user_id, viewer_id),
)?;
let details = match details {
None => return Ok(None),
Some(details) => details,
};
let counts = counts.unwrap_or_default();
let relationship = relationship.unwrap_or_default();
let tags = match counts.tags {
0 => Vec::new(),
_ => TagUser::get_by_id(user_id, None, None, None, None, viewer_id, depth)
.await?
.unwrap_or_default(),
};
Ok(Some(Self {
details,
counts,
relationship,
tags,
}))
}
}