use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[cfg(feature = "utoipa")]
use utoipa::ToSchema;
#[cfg(feature = "validator")]
use validator::Validate;
use crate::v1::types::{
notifications::NotifsRoom,
user_config::UserConfigRoom,
util::{some_option, Diff},
ChannelId, MediaId, Permission, UserId,
};
use super::{ids::RoomId, util::Time};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct Room {
pub id: RoomId,
pub version_id: Uuid,
pub owner_id: Option<UserId>,
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 64))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 64)))]
pub name: String,
#[cfg_attr(
feature = "utoipa",
schema(required = false, min_length = 1, max_length = 8192)
)]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 8192)))]
pub description: Option<String>,
pub icon: Option<MediaId>,
#[serde(rename = "type")]
pub room_type: RoomType,
pub member_count: u64,
pub online_count: u64,
pub channel_count: u64,
pub archived_at: Option<Time>,
pub public: bool,
pub welcome_channel_id: Option<ChannelId>,
pub quarantined: bool,
pub user_config: Option<UserConfigRoom>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct RoomPrivate {
pub notifications: NotifsRoom,
pub permissions: Vec<Permission>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct RoomCreate {
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 64))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 64)))]
pub name: String,
#[cfg_attr(
feature = "utoipa",
schema(required = false, min_length = 1, max_length = 8192)
)]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 8192)))]
pub description: Option<String>,
pub icon: Option<MediaId>,
pub public: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct RoomPatch {
#[cfg_attr(feature = "utoipa", schema(min_length = 1, max_length = 64))]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 64)))]
pub name: Option<String>,
#[cfg_attr(
feature = "utoipa",
schema(required = false, min_length = 1, max_length = 8192)
)]
#[cfg_attr(feature = "validator", validate(length(min = 1, max = 8192)))]
#[serde(default, deserialize_with = "some_option")]
pub description: Option<Option<String>>,
pub icon: Option<Option<MediaId>>,
pub public: Option<bool>,
pub welcome_channel_id: Option<Option<ChannelId>>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum RoomType {
#[default]
Default,
Server,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct RoomMetrics {
pub channel_count: u64,
pub active_channel_count: u64,
pub message_count: u64,
pub member_count: u64,
pub media_count: u64,
pub media_size: u64,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct TransferOwnership {
pub owner_id: UserId,
}
impl Diff<Room> for RoomPatch {
fn changes(&self, other: &Room) -> bool {
self.name.changes(&other.name)
|| self.description.changes(&other.description)
|| self.icon.changes(&other.icon)
|| self.public.changes(&other.public)
|| self.welcome_channel_id.changes(&other.welcome_channel_id)
}
}