Skip to main content

agentlink_core/protocols/
friend.rs

1//! Friend Protocol Types
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use super::user::User;
7
8/// 好友关系
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Friendship {
11    pub id: String,
12    pub user_id: String,
13    pub friend_id: String,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub remark: Option<String>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub group_id: Option<String>,
18    pub is_favorite: bool,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub tags: Option<Value>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub can_view_moments: Option<bool>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub can_view_album: Option<bool>,
25    pub friend_since: String,
26    pub created_at: String,
27    pub updated_at: String,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub friend: Option<User>,
30    #[serde(default)]
31    pub group: Option<FriendGroupInfo>,
32}
33
34/// 好友分组信息
35#[derive(Debug, Clone, Default, Serialize, Deserialize)]
36#[serde(default)]
37pub struct FriendGroupInfo {
38    pub id: Option<String>,
39    pub name: Option<String>,
40}
41
42/// 好友列表响应
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct FriendsListResponse {
45    pub total: i32,
46    pub friends: Vec<Friendship>,
47}
48
49/// 同步好友列表数据
50/// 
51/// Protocol: mqtt-events.md#sync_friend_list
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct SyncFriendListData {
54    pub friends: Vec<Friendship>,
55    pub groups: Vec<FriendGroup>,
56}
57
58/// 好友请求
59#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct FriendRequest {
61    pub id: String,
62    pub from_user_id: String,
63    pub to_user_id: String,
64    pub status: String,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub message: Option<String>,
67    pub req_count: i32,
68    pub last_req_at: String,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub responded_at: Option<String>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub responded_message: Option<String>,
73    pub expires_at: String,
74    pub created_at: String,
75    pub updated_at: String,
76}
77
78/// 好友请求列表响应
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct FriendRequestsResponse {
81    pub pending: i32,
82    pub requests: Vec<FriendRequest>,
83}
84
85/// 同步好友请求列表数据
86/// 
87/// Protocol: mqtt-events.md#sync_friend_request_list
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct SyncFriendRequestsData {
90    pub requests: Vec<FriendRequest>,
91    pub total: i32,
92    pub sync_id: i64,
93}
94
95/// 发送好友请求
96#[derive(Debug, Clone, Serialize)]
97pub struct SendFriendRequest {
98    pub to_user_id: String,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub message: Option<String>,
101}
102
103/// 响应好友请求
104#[derive(Debug, Clone, Deserialize)]
105pub struct RespondFriendRequest {
106    pub request_id: String,
107    pub accept: bool,
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub message: Option<String>,
110}
111
112// 自定义序列化:将 accept 布尔值转换为 action 字符串
113impl Serialize for RespondFriendRequest {
114    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
115    where
116        S: serde::Serializer,
117    {
118        use serde::ser::SerializeStruct;
119
120        let mut state = serializer.serialize_struct("RespondFriendRequest", 3)?;
121        state.serialize_field("request_id", &self.request_id)?;
122        state.serialize_field("action", if self.accept { "accepted" } else { "rejected" })?;
123        state.serialize_field("message", &self.message)?;
124        state.end()
125    }
126}
127
128/// 好友分组
129#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct FriendGroup {
131    pub id: String,
132    pub user_id: String,
133    pub name: String,
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub color: Option<String>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub icon: Option<String>,
138    pub sort_order: i32,
139    pub created_at: String,
140    pub updated_at: String,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub member_count: Option<i32>,
143}
144
145/// 创建好友分组请求
146#[derive(Debug, Clone, Serialize)]
147pub struct CreateFriendGroupRequest {
148    pub name: String,
149    #[serde(skip_serializing_if = "Option::is_none")]
150    pub color: Option<String>,
151    #[serde(skip_serializing_if = "Option::is_none")]
152    pub icon: Option<String>,
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub sort_order: Option<i32>,
155}
156
157/// 更新好友分组请求
158#[derive(Debug, Clone, Serialize)]
159pub struct UpdateFriendGroupRequest {
160    #[serde(skip_serializing_if = "Option::is_none")]
161    pub name: Option<String>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub color: Option<String>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    pub icon: Option<String>,
166    #[serde(skip_serializing_if = "Option::is_none")]
167    pub sort_order: Option<i32>,
168}
169
170/// 更新好友关系请求
171#[derive(Debug, Clone, Serialize)]
172pub struct UpdateFriendshipRequest {
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub remark: Option<String>,
175    #[serde(skip_serializing_if = "Option::is_none")]
176    pub group_id: Option<String>,
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub is_favorite: Option<bool>,
179    #[serde(skip_serializing_if = "Option::is_none")]
180    pub tags: Option<Vec<String>>,
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub can_view_moments: Option<bool>,
183    #[serde(skip_serializing_if = "Option::is_none")]
184    pub can_view_album: Option<bool>,
185}