use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::events::TimelineEventType;
use crate::identifiers::*;
use crate::push::{PusherData, Tweak};
use crate::serde::StringEnum;
use crate::{PrivOwnedStr, RawJsonValue, UnixSeconds};
#[derive(ToSchema, Serialize, Debug)]
pub struct SendEventNotificationReqBody {
pub notification: Notification,
}
crate::json_body_modifier!(SendEventNotificationReqBody);
impl SendEventNotificationReqBody {
pub fn new(notification: Notification) -> Self {
Self { notification }
}
}
#[derive(ToSchema, Serialize, Debug)]
pub struct SendEventNotificationResBody {
pub rejected: Vec<String>,
}
impl SendEventNotificationResBody {
pub fn new(rejected: Vec<String>) -> Self {
Self { rejected }
}
}
#[derive(ToSchema, Default, Deserialize, Serialize, Clone, Debug)]
pub struct Notification {
#[serde(skip_serializing_if = "Option::is_none")]
pub event_id: Option<OwnedEventId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub room_id: Option<OwnedRoomId>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub event_type: Option<TimelineEventType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sender: Option<OwnedUserId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sender_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub room_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub room_alias: Option<OwnedRoomAliasId>,
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub user_is_target: bool,
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub prio: NotificationPriority,
#[serde(skip_serializing_if = "Option::is_none")]
#[salvo(schema(value_type = Object))]
pub content: Option<Box<RawJsonValue>>,
#[serde(default, skip_serializing_if = "NotificationCounts::is_default")]
pub counts: NotificationCounts,
pub devices: Vec<Device>,
}
impl Notification {
pub fn new(devices: Vec<Device>) -> Self {
Notification {
devices,
..Default::default()
}
}
}
#[derive(ToSchema, Clone, Default, PartialEq, Eq, StringEnum)]
#[palpo_enum(rename_all = "snake_case")]
#[non_exhaustive]
pub enum NotificationPriority {
#[default]
High,
Low,
#[doc(hidden)]
#[salvo(schema(skip))]
_Custom(PrivOwnedStr),
}
#[derive(ToSchema, Deserialize, Serialize, Default, Clone, Debug)]
pub struct NotificationCounts {
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub unread: usize,
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub missed_calls: usize,
}
impl NotificationCounts {
pub fn new(unread: usize, missed_calls: usize) -> Self {
NotificationCounts { unread, missed_calls }
}
fn is_default(&self) -> bool {
self.unread == 0 && self.missed_calls == 0
}
}
#[derive(ToSchema, Clone, Debug, Deserialize, Serialize)]
pub struct Device {
pub app_id: String,
pub pushkey: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub pushkey_ts: Option<UnixSeconds>,
#[serde(default, skip_serializing_if = "PusherData::is_empty")]
pub data: PusherData,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tweaks: Vec<Tweak>,
}
impl Device {
pub fn new(app_id: String, pushkey: String) -> Self {
Device {
app_id,
pushkey,
pushkey_ts: None,
data: PusherData::new(),
tweaks: Vec::new(),
}
}
}