use serde::{Deserialize, Serialize};
#[cfg(feature = "utoipa")]
use utoipa::ToSchema;
use std::collections::HashMap;
use crate::v1::types::{
util::Time, Channel, ChannelId, Invite, InviteCode, Message, MessageId, MessageVerId,
Relationship, Role, RoleId, Room, RoomId, RoomMember, Session, SessionId, ThreadMember, User,
UserId,
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct SyncFilterId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum SyncFilter {
SubAll {
id: SyncFilterId,
},
SubRoom {
id: SyncFilterId,
room_id: RoomId,
},
SubRoomAll {
id: SyncFilterId,
room_id: RoomId,
},
SubThread {
id: SyncFilterId,
thread_id: ChannelId,
},
Unsub {
id: SyncFilterId,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[serde(tag = "type")]
pub enum SyncTransport {
Webhook {
url: String,
},
Websocket,
Poll,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageSynchronizeGlobal {
pub room: HashMap<RoomId, Option<Room>>,
pub user: HashMap<UserId, Option<User>>,
pub dm: HashMap<UserId, Option<Room>>,
pub relationship: HashMap<UserId, Option<Relationship>>,
pub session: HashMap<SessionId, Option<Session>>,
pub invite: HashMap<InviteCode, Option<Invite>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageSynchronizeRoom {
pub room_id: RoomId,
pub role: HashMap<RoleId, Option<Role>>,
pub room_member: HashMap<(RoomId, UserId), Option<RoomMember>>,
pub thread: HashMap<ChannelId, Option<Channel>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageSynchronizeThread {
pub thread_id: ChannelId,
pub thread_member: HashMap<(ChannelId, UserId), Option<ThreadMember>>,
pub message: HashMap<MessageId, Option<Message>>,
pub message_version: HashMap<MessageVerId, Option<Message>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op")]
pub enum Event {
Ping,
Error { error: String },
Ready {},
Resumed,
Reconnect { can_resume: bool },
Dispatch(Payload),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op")]
pub enum Payload {
SyncGlobal(MessageSynchronizeGlobal),
SyncRoom(MessageSynchronizeRoom),
SyncThread(MessageSynchronizeThread),
Typing {
thread_id: ChannelId,
user_id: UserId,
until: Time,
},
Dispatch {
action: String,
payload: Option<serde_json::Value>,
},
}