agentlink_core/protocols/
friend.rs1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use super::user::User;
7
8#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct FriendsListResponse {
45 pub total: i32,
46 pub friends: Vec<Friendship>,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct SyncFriendListData {
54 pub friends: Vec<Friendship>,
55 pub groups: Vec<FriendGroup>,
56}
57
58#[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#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct FriendRequestsResponse {
81 pub pending: i32,
82 pub requests: Vec<FriendRequest>,
83}
84
85#[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#[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#[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
112impl 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#[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#[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#[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#[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}