use crate::models::follow::{Followers, UserFollows};
use crate::models::user::Muted;
use super::UserCounts;
use crate::types::DynError;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
#[derive(Serialize, Deserialize, ToSchema, Debug, Default)]
pub struct Relationship {
pub following: bool,
pub followed_by: bool,
pub muted: bool,
}
impl Relationship {
pub async fn get_by_id(
user_id: &str,
viewer_id: Option<&str>,
) -> Result<Option<Self>, DynError> {
match viewer_id {
None => Ok(None),
Some(v_id) => Self::get_from_index(user_id, v_id).await,
}
}
pub async fn get_from_index(
user_id: &str,
viewer_id: &str,
) -> Result<Option<Relationship>, DynError> {
let user_exist = UserCounts::get_from_index(user_id).await?;
let viewer_exist = UserCounts::get_from_index(viewer_id).await?;
if user_exist.is_none() || viewer_exist.is_none() {
return Ok(None);
}
let (following, followed_by, muted) = tokio::try_join!(
Followers::check(user_id, viewer_id),
Followers::check(viewer_id, user_id),
Muted::check(viewer_id, user_id),
)?;
Ok(Some(Self {
followed_by,
following,
muted,
}))
}
}