use serde::{Deserialize, Serialize};
use crate::{
models::{Attachment, Id, User, UserProfile, UserStatus},
Context, Result,
};
#[cfg(feature = "cache")]
use crate::cache::UpdateCache;
#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize)]
pub enum UserField {
ProfileContent,
ProfileBackground,
StatusText,
Avatar,
}
#[derive(Debug, Deserialize, Clone, PartialEq)]
pub struct UserUpdateEvent {
#[serde(rename = "id")]
pub user_id: Id,
pub data: PartialUser,
pub clear: Option<UserField>,
}
impl UserUpdateEvent {
pub async fn user(&self, cx: &Context) -> Result<User> {
User::fetch(cx, &self.user_id).await
}
}
#[derive(Debug, Deserialize, Clone, PartialEq)]
pub struct PartialUser {
pub status: Option<UserStatus>,
pub profile: Option<UserProfile>,
pub avatar: Option<Attachment>,
pub online: Option<bool>,
}
#[cfg(feature = "cache")]
#[async_trait::async_trait]
impl UpdateCache for UserUpdateEvent {
async fn update(&self, cx: &Context) {
if let Some(user) = cx.cache.users.write().await.get_mut(&self.user_id) {
if let Some(field) = self.clear {
match field {
UserField::StatusText => {
if let Some(ref mut status) = user.status {
status.text = None;
}
}
UserField::Avatar => user.avatar = None,
_ => {}
}
}
if let Some(ref status) = self.data.status {
user.status = Some(status.clone());
}
if let Some(ref avatar) = self.data.avatar {
user.avatar = Some(avatar.clone());
}
if let Some(online) = self.data.online {
user.online = online;
}
}
}
}