1use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9use super::{
10 conversation::{Conversation, SyncConversationListData},
11 friend::{FriendRequest, Friendship, SyncFriendListData, SyncFriendRequestsData},
12 message::{NewMessageData, SyncMessageHistoryData},
13 user::User,
14};
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(tag = "event_type")]
21pub enum ServerEvent {
22 #[serde(rename = "new_message")]
25 NewMessage { data: NewMessageData },
26
27 #[serde(rename = "sync_message_history")]
29 SyncMessageHistory { data: SyncMessageHistoryData },
30
31 #[serde(rename = "message_status_updated")]
33 MessageStatusUpdated { data: MessageStatusUpdatedData },
34
35 #[serde(rename = "message_deleted")]
37 MessageDeleted { data: MessageDeletedData },
38
39 #[serde(rename = "sync_conversation_list")]
42 SyncConversationList { data: SyncConversationListData },
43
44 #[serde(rename = "conversation_updated")]
46 ConversationUpdated { data: Conversation },
47
48 #[serde(rename = "conversation_members_updated")]
50 ConversationMembersUpdated { data: ConversationMembersUpdatedData },
51
52 #[serde(rename = "added_to_conversation")]
54 AddedToConversation { data: Conversation },
55
56 #[serde(rename = "removed_from_conversation")]
58 RemovedFromConversation { data: RemovedFromConversationData },
59
60 #[serde(rename = "sync_friend_list")]
63 SyncFriendList { data: SyncFriendListData },
64
65 #[serde(rename = "friendship_updated")]
67 FriendshipUpdated { data: Friendship },
68
69 #[serde(rename = "friend_deleted")]
71 FriendDeleted { data: FriendDeletedData },
72
73 #[serde(rename = "friend_request_received")]
76 FriendRequestReceived { data: FriendRequest },
77
78 #[serde(rename = "friend_request_responded")]
80 FriendRequestResponded { data: FriendRequest },
81
82 #[serde(rename = "sync_friend_requests")]
84 SyncFriendRequests { data: SyncFriendRequestsData },
85
86 #[serde(rename = "user_presence_updated")]
89 UserPresenceUpdated { data: UserPresenceData },
90
91 #[serde(rename = "user_info_updated")]
93 UserInfoUpdated { data: User },
94
95 #[serde(rename = "added_to_blacklist")]
98 AddedToBlacklist { data: BlacklistEventData },
99
100 #[serde(rename = "removed_from_blacklist")]
102 RemovedFromBlacklist { data: BlacklistEventData },
103
104 #[serde(rename = "notification")]
107 Notification { data: NotificationData },
108
109 #[serde(rename = "system_message")]
111 SystemMessage { data: SystemMessageData },
112
113 #[serde(rename = "sync_completed")]
115 SyncCompleted { data: SyncCompletedData },
116
117 #[serde(rename = "data_updated")]
119 DataUpdated { data: DataUpdatedData },
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct MessageStatusUpdatedData {
125 pub conversation_id: String,
126 pub message_id: String,
127 pub status: String,
128 pub updated_at: String,
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct MessageDeletedData {
134 pub conversation_id: String,
135 pub message_id: String,
136 pub deleted_at: String,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize)]
141pub struct ConversationMembersUpdatedData {
142 pub conversation_id: String,
143 pub members: Vec<ConversationMemberInfo>,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct ConversationMemberInfo {
149 pub user_id: String,
150 pub role: String,
151 pub joined_at: String,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct RemovedFromConversationData {
157 pub conversation_id: String,
158 pub removed_by: String,
159 pub removed_at: String,
160}
161
162#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct FriendDeletedData {
165 pub friend_id: String,
166 pub deleted_at: String,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
171pub struct UserPresenceData {
172 pub user_id: String,
173 pub online: bool,
174 #[serde(skip_serializing_if = "Option::is_none")]
175 pub device_type: Option<String>,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 pub last_seen_at: Option<String>,
178 pub timestamp: String,
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize)]
183pub struct BlacklistEventData {
184 pub user_id: String,
185 pub blocked_user_id: String,
186 pub timestamp: String,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct NotificationData {
192 pub id: String,
193 #[serde(rename = "type")]
194 pub notification_type: String,
195 pub title: String,
196 pub content: String,
197 #[serde(skip_serializing_if = "Option::is_none")]
198 pub data: Option<Value>,
199 pub created_at: String,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
204pub struct SystemMessageData {
205 pub id: String,
206 pub message: String,
207 #[serde(skip_serializing_if = "Option::is_none")]
208 pub data: Option<Value>,
209 pub created_at: String,
210}
211
212#[derive(Debug, Clone, Serialize, Deserialize)]
214pub struct SyncCompletedData {
215 pub sync_type: String,
216 pub timestamp: String,
217 #[serde(default)]
218 pub item_count: i32,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
223pub struct DataUpdatedData {
224 pub data_type: String,
225 pub operation: String, #[serde(skip_serializing_if = "Option::is_none")]
227 pub data: Option<Value>,
228 pub timestamp: String,
229}
230
231#[derive(Debug, Clone)]
233pub struct RawMqttMessage {
234 pub topic: String,
235 pub payload: Vec<u8>,
236 pub qos: u8,
237}
238
239#[derive(Debug, Clone, Serialize, Deserialize)]
241pub struct EventMeta {
242 pub seq_id: i64,
243 pub timestamp: String,
244 #[serde(skip_serializing_if = "Option::is_none")]
245 pub source: Option<String>,
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize)]
250pub struct ServerEventEnvelope {
251 #[serde(flatten)]
252 pub event: ServerEvent,
253 #[serde(flatten)]
254 pub meta: EventMeta,
255}
256
257impl ServerEvent {
258 pub fn event_type(&self) -> &'static str {
260 match self {
261 ServerEvent::NewMessage { .. } => "new_message",
262 ServerEvent::SyncMessageHistory { .. } => "sync_message_history",
263 ServerEvent::MessageStatusUpdated { .. } => "message_status_updated",
264 ServerEvent::MessageDeleted { .. } => "message_deleted",
265 ServerEvent::SyncConversationList { .. } => "sync_conversation_list",
266 ServerEvent::ConversationUpdated { .. } => "conversation_updated",
267 ServerEvent::ConversationMembersUpdated { .. } => "conversation_members_updated",
268 ServerEvent::AddedToConversation { .. } => "added_to_conversation",
269 ServerEvent::RemovedFromConversation { .. } => "removed_from_conversation",
270 ServerEvent::SyncFriendList { .. } => "sync_friend_list",
271 ServerEvent::FriendshipUpdated { .. } => "friendship_updated",
272 ServerEvent::FriendDeleted { .. } => "friend_deleted",
273 ServerEvent::FriendRequestReceived { .. } => "friend_request_received",
274 ServerEvent::FriendRequestResponded { .. } => "friend_request_responded",
275 ServerEvent::SyncFriendRequests { .. } => "sync_friend_requests",
276 ServerEvent::UserPresenceUpdated { .. } => "user_presence_updated",
277 ServerEvent::UserInfoUpdated { .. } => "user_info_updated",
278 ServerEvent::AddedToBlacklist { .. } => "added_to_blacklist",
279 ServerEvent::RemovedFromBlacklist { .. } => "removed_from_blacklist",
280 ServerEvent::Notification { .. } => "notification",
281 ServerEvent::SystemMessage { .. } => "system_message",
282 ServerEvent::SyncCompleted { .. } => "sync_completed",
283 ServerEvent::DataUpdated { .. } => "data_updated",
284 }
285 }
286
287 pub fn is_sync_event(&self) -> bool {
289 matches!(
290 self,
291 ServerEvent::SyncMessageHistory { .. }
292 | ServerEvent::SyncConversationList { .. }
293 | ServerEvent::SyncFriendList { .. }
294 | ServerEvent::SyncFriendRequests { .. }
295 | ServerEvent::SyncCompleted { .. }
296 )
297 }
298
299 pub fn conversation_id(&self) -> Option<String> {
301 match self {
302 ServerEvent::NewMessage { data } => Some(data.conversation_id.clone()),
303 ServerEvent::SyncMessageHistory { data } => Some(data.conversation_id.clone()),
304 ServerEvent::MessageStatusUpdated { data } => Some(data.conversation_id.clone()),
305 ServerEvent::MessageDeleted { data } => Some(data.conversation_id.clone()),
306 ServerEvent::ConversationUpdated { data } => Some(data.id.clone()),
307 ServerEvent::ConversationMembersUpdated { data } => Some(data.conversation_id.clone()),
308 ServerEvent::AddedToConversation { data } => Some(data.id.clone()),
309 ServerEvent::RemovedFromConversation { data } => Some(data.conversation_id.clone()),
310 _ => None,
311 }
312 }
313
314 pub fn user_id(&self) -> Option<String> {
316 match self {
317 ServerEvent::UserPresenceUpdated { data } => Some(data.user_id.clone()),
318 ServerEvent::UserInfoUpdated { data } => Some(data.id.clone()),
319 ServerEvent::FriendshipUpdated { data } => Some(data.friend_id.clone()),
320 ServerEvent::FriendDeleted { data } => Some(data.friend_id.clone()),
321 _ => None,
322 }
323 }
324}