agentlink-core 0.1.0

AgentLink SDK Core - Platform agnostic core library
Documentation
//! MQTT Events Protocol
//!
//! This module defines all MQTT event types that can be received from the server.
//! These events follow the protocol defined in MRD documentation.

use serde::{Deserialize, Serialize};
use serde_json::Value;

use super::{
    conversation::{Conversation, SyncConversationListData},
    friend::{FriendRequest, Friendship, SyncFriendListData, SyncFriendRequestsData},
    message::{NewMessageData, SyncMessageHistoryData},
    user::User,
};

/// 服务端 MQTT 事件
///
/// 这些事件通过 MQTT 主题推送,使用 event_type 字段进行区分
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "event_type")]
pub enum ServerEvent {
    // ==================== 消息事件 ====================
    /// 新消息
    #[serde(rename = "new_message")]
    NewMessage { data: NewMessageData },

    /// 消息历史同步
    #[serde(rename = "sync_message_history")]
    SyncMessageHistory { data: SyncMessageHistoryData },

    /// 消息状态更新
    #[serde(rename = "message_status_updated")]
    MessageStatusUpdated { data: MessageStatusUpdatedData },

    /// 消息被删除
    #[serde(rename = "message_deleted")]
    MessageDeleted { data: MessageDeletedData },

    // ==================== 会话事件 ====================
    /// 会话列表同步
    #[serde(rename = "sync_conversation_list")]
    SyncConversationList { data: SyncConversationListData },

    /// 会话更新
    #[serde(rename = "conversation_updated")]
    ConversationUpdated { data: Conversation },

    /// 会话成员更新
    #[serde(rename = "conversation_members_updated")]
    ConversationMembersUpdated { data: ConversationMembersUpdatedData },

    /// 用户被添加到会话
    #[serde(rename = "added_to_conversation")]
    AddedToConversation { data: Conversation },

    /// 用户被从会话移除
    #[serde(rename = "removed_from_conversation")]
    RemovedFromConversation { data: RemovedFromConversationData },

    // ==================== 好友事件 ====================
    /// 好友列表同步
    #[serde(rename = "sync_friend_list")]
    SyncFriendList { data: SyncFriendListData },

    /// 好友关系更新
    #[serde(rename = "friendship_updated")]
    FriendshipUpdated { data: Friendship },

    /// 好友被删除
    #[serde(rename = "friend_deleted")]
    FriendDeleted { data: FriendDeletedData },

    // ==================== 好友请求事件 ====================
    /// 收到好友请求
    #[serde(rename = "friend_request_received")]
    FriendRequestReceived { data: FriendRequest },

    /// 好友请求被响应
    #[serde(rename = "friend_request_responded")]
    FriendRequestResponded { data: FriendRequest },

    /// 好友请求列表同步
    #[serde(rename = "sync_friend_requests")]
    SyncFriendRequests { data: SyncFriendRequestsData },

    // ==================== 用户状态事件 ====================
    /// 用户在线状态更新
    #[serde(rename = "user_presence_updated")]
    UserPresenceUpdated { data: UserPresenceData },

    /// 用户信息更新
    #[serde(rename = "user_info_updated")]
    UserInfoUpdated { data: User },

    // ==================== 黑名单事件 ====================
    /// 被添加到黑名单
    #[serde(rename = "added_to_blacklist")]
    AddedToBlacklist { data: BlacklistEventData },

    /// 被从黑名单移除
    #[serde(rename = "removed_from_blacklist")]
    RemovedFromBlacklist { data: BlacklistEventData },

    // ==================== 系统事件 ====================
    /// 通知
    #[serde(rename = "notification")]
    Notification { data: NotificationData },

    /// 系统消息
    #[serde(rename = "system_message")]
    SystemMessage { data: SystemMessageData },

    /// 同步完成
    #[serde(rename = "sync_completed")]
    SyncCompleted { data: SyncCompletedData },

    /// 通用数据更新
    #[serde(rename = "data_updated")]
    DataUpdated { data: DataUpdatedData },
}

/// 消息状态更新数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageStatusUpdatedData {
    pub conversation_id: String,
    pub message_id: String,
    pub status: String,
    pub updated_at: String,
}

/// 消息删除数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessageDeletedData {
    pub conversation_id: String,
    pub message_id: String,
    pub deleted_at: String,
}

/// 会话成员更新数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversationMembersUpdatedData {
    pub conversation_id: String,
    pub members: Vec<ConversationMemberInfo>,
}

/// 会话成员信息
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversationMemberInfo {
    pub user_id: String,
    pub role: String,
    pub joined_at: String,
}

/// 被移除会话数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RemovedFromConversationData {
    pub conversation_id: String,
    pub removed_by: String,
    pub removed_at: String,
}

/// 好友删除数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FriendDeletedData {
    pub friend_id: String,
    pub deleted_at: String,
}

/// 用户在线状态数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserPresenceData {
    pub user_id: String,
    pub online: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub device_type: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_seen_at: Option<String>,
    pub timestamp: String,
}

/// 黑名单事件数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlacklistEventData {
    pub user_id: String,
    pub blocked_user_id: String,
    pub timestamp: String,
}

/// 通知数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationData {
    pub id: String,
    #[serde(rename = "type")]
    pub notification_type: String,
    pub title: String,
    pub content: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub data: Option<Value>,
    pub created_at: String,
}

/// 系统消息数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemMessageData {
    pub id: String,
    pub message: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub data: Option<Value>,
    pub created_at: String,
}

/// 同步完成数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyncCompletedData {
    pub sync_type: String,
    pub timestamp: String,
    #[serde(default)]
    pub item_count: i32,
}

/// 数据更新数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataUpdatedData {
    pub data_type: String,
    pub operation: String, // created, updated, deleted
    #[serde(skip_serializing_if = "Option::is_none")]
    pub data: Option<Value>,
    pub timestamp: String,
}

/// 原始 MQTT 消息
#[derive(Debug, Clone)]
pub struct RawMqttMessage {
    pub topic: String,
    pub payload: Vec<u8>,
    pub qos: u8,
}

/// 事件元数据
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventMeta {
    pub seq_id: i64,
    pub timestamp: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub source: Option<String>,
}

/// 完整事件包装(包含元数据)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerEventEnvelope {
    #[serde(flatten)]
    pub event: ServerEvent,
    #[serde(flatten)]
    pub meta: EventMeta,
}

impl ServerEvent {
    /// 获取事件类型字符串
    pub fn event_type(&self) -> &'static str {
        match self {
            ServerEvent::NewMessage { .. } => "new_message",
            ServerEvent::SyncMessageHistory { .. } => "sync_message_history",
            ServerEvent::MessageStatusUpdated { .. } => "message_status_updated",
            ServerEvent::MessageDeleted { .. } => "message_deleted",
            ServerEvent::SyncConversationList { .. } => "sync_conversation_list",
            ServerEvent::ConversationUpdated { .. } => "conversation_updated",
            ServerEvent::ConversationMembersUpdated { .. } => "conversation_members_updated",
            ServerEvent::AddedToConversation { .. } => "added_to_conversation",
            ServerEvent::RemovedFromConversation { .. } => "removed_from_conversation",
            ServerEvent::SyncFriendList { .. } => "sync_friend_list",
            ServerEvent::FriendshipUpdated { .. } => "friendship_updated",
            ServerEvent::FriendDeleted { .. } => "friend_deleted",
            ServerEvent::FriendRequestReceived { .. } => "friend_request_received",
            ServerEvent::FriendRequestResponded { .. } => "friend_request_responded",
            ServerEvent::SyncFriendRequests { .. } => "sync_friend_requests",
            ServerEvent::UserPresenceUpdated { .. } => "user_presence_updated",
            ServerEvent::UserInfoUpdated { .. } => "user_info_updated",
            ServerEvent::AddedToBlacklist { .. } => "added_to_blacklist",
            ServerEvent::RemovedFromBlacklist { .. } => "removed_from_blacklist",
            ServerEvent::Notification { .. } => "notification",
            ServerEvent::SystemMessage { .. } => "system_message",
            ServerEvent::SyncCompleted { .. } => "sync_completed",
            ServerEvent::DataUpdated { .. } => "data_updated",
        }
    }

    /// 判断是否为数据同步事件
    pub fn is_sync_event(&self) -> bool {
        matches!(
            self,
            ServerEvent::SyncMessageHistory { .. }
                | ServerEvent::SyncConversationList { .. }
                | ServerEvent::SyncFriendList { .. }
                | ServerEvent::SyncFriendRequests { .. }
                | ServerEvent::SyncCompleted { .. }
        )
    }

    /// 获取关联的会话 ID(如果有)
    pub fn conversation_id(&self) -> Option<String> {
        match self {
            ServerEvent::NewMessage { data } => Some(data.conversation_id.clone()),
            ServerEvent::SyncMessageHistory { data } => Some(data.conversation_id.clone()),
            ServerEvent::MessageStatusUpdated { data } => Some(data.conversation_id.clone()),
            ServerEvent::MessageDeleted { data } => Some(data.conversation_id.clone()),
            ServerEvent::ConversationUpdated { data } => Some(data.id.clone()),
            ServerEvent::ConversationMembersUpdated { data } => Some(data.conversation_id.clone()),
            ServerEvent::AddedToConversation { data } => Some(data.id.clone()),
            ServerEvent::RemovedFromConversation { data } => Some(data.conversation_id.clone()),
            _ => None,
        }
    }

    /// 获取关联的用户 ID(如果有)
    pub fn user_id(&self) -> Option<String> {
        match self {
            ServerEvent::UserPresenceUpdated { data } => Some(data.user_id.clone()),
            ServerEvent::UserInfoUpdated { data } => Some(data.id.clone()),
            ServerEvent::FriendshipUpdated { data } => Some(data.friend_id.clone()),
            ServerEvent::FriendDeleted { data } => Some(data.friend_id.clone()),
            _ => None,
        }
    }
}