use serde::{Deserialize, Serialize};
#[cfg(feature = "utoipa")]
use utoipa::{IntoParams, ToSchema};
#[cfg(feature = "validator")]
use validator::Validate;
use crate::v1::types::{
util::Time, Channel, ChannelId, Message, MessageId, NotificationId, PaginationResponse, Room,
RoomId,
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum NotifAction {
Notify,
Watching,
Ignore,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct NotifsGlobal {
pub mute: Option<Mute>,
pub messages: NotifAction,
pub mentions: NotifAction,
pub threads: NotifAction,
pub room_public: NotifAction,
pub room_private: NotifAction,
pub room_dm: NotifAction,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct NotifsRoom {
pub mute: Option<Mute>,
pub messages: Option<NotifAction>,
pub mentions: Option<NotifAction>,
pub threads: Option<NotifAction>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct NotifsChannel {
pub mute: Option<Mute>,
pub messages: Option<NotifAction>,
pub mentions: Option<NotifAction>,
pub threads: Option<NotifAction>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct NotifsMessage {
pub mute: Option<Mute>,
pub replies: Option<NotifAction>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct Mute {
pub expires_at: Option<Time>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct Notification {
pub id: NotificationId,
pub channel_id: ChannelId,
pub message_id: MessageId,
pub reason: NotificationReason,
pub added_at: Time,
pub read_at: Option<Time>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum NotificationReason {
Reminder,
Mention,
MentionBulk,
Reply,
}
impl Default for NotifsGlobal {
fn default() -> Self {
NotifsGlobal {
mute: None,
messages: NotifAction::Watching,
mentions: NotifAction::Notify,
threads: NotifAction::Watching,
room_public: NotifAction::Watching,
room_private: NotifAction::Watching,
room_dm: NotifAction::Watching,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema, IntoParams))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct InboxListParams {
#[serde(default)]
#[schema(required = false, min_length = 1, max_length = 32)]
#[validate(length(min = 1, max = 32))]
pub room_id: Vec<RoomId>,
#[serde(default)]
#[schema(required = false, min_length = 1, max_length = 32)]
#[validate(length(min = 1, max = 32))]
pub channel_id: Vec<ChannelId>,
#[serde(default)]
pub include_read: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct NotificationCreate {
pub channel_id: ChannelId,
pub message_id: MessageId,
pub added_at: Option<Time>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct NotificationMarkRead {
#[serde(default)]
#[schema(required = false, min_length = 1, max_length = 1024)]
#[validate(length(min = 1, max = 1024))]
pub message_ids: Vec<MessageId>,
#[serde(default)]
#[schema(required = false, min_length = 1, max_length = 1024)]
#[validate(length(min = 1, max = 1024))]
pub channel_ids: Vec<ChannelId>,
#[serde(default)]
#[schema(required = false, min_length = 1, max_length = 1024)]
#[validate(length(min = 1, max = 1024))]
pub room_ids: Vec<RoomId>,
#[serde(default)]
pub everything: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema, IntoParams))]
#[cfg_attr(feature = "validator", derive(Validate))]
pub struct NotificationFlush {
pub before: Option<MessageId>,
pub after: Option<MessageId>,
#[schema(required = false, min_length = 1, max_length = 1024)]
#[validate(length(min = 1, max = 1024))]
pub message_ids: Option<Vec<MessageId>>,
#[schema(required = false, min_length = 1, max_length = 1024)]
#[validate(length(min = 1, max = 1024))]
pub channel_ids: Option<Vec<ChannelId>>,
#[schema(required = false, min_length = 1, max_length = 1024)]
#[validate(length(min = 1, max = 1024))]
pub room_ids: Option<Vec<RoomId>>,
#[serde(default)]
pub include_unread: bool,
}
#[derive(Debug, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct NotificationPagination {
#[serde(flatten)]
pub inner: PaginationResponse<Notification>,
pub channels: Vec<Channel>,
pub messages: Vec<Message>,
pub rooms: Vec<Room>,
}