Skip to main content

privchat_protocol/rpc/contact/
friend.rs

1// Copyright 2025 Shanghai Boyu Information Technology Co., Ltd.
2// https://privchat.dev
3//
4// Author: zoujiaqing <zoujiaqing@gmail.com>
5//
6// Licensed under the Apache License, Version 2.0 (the "License");
7// you may not use this file except in compliance with the License.
8// You may obtain a copy of the License at
9//
10//     http://www.apache.org/licenses/LICENSE-2.0
11//
12// Unless required by applicable law or agreed to in writing, software
13// distributed under the License is distributed on an "AS IS" BASIS,
14// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15// See the License for the specific language governing permissions and
16// limitations under the License.
17
18/// 好友相关 RPC
19use serde::{Deserialize, Serialize};
20
21/// 申请添加好友请求
22///
23/// RPC路由: `contact/friend/apply`
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct FriendApplyRequest {
26    /// 目标用户ID
27    pub target_user_id: u64,
28    /// 申请消息
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub message: Option<String>,
31    /// 来源
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub source: Option<String>,
34    /// 来源ID
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub source_id: Option<String>,
37
38    /// 申请者ID(服务器端填充,客户端不可设置)
39    #[serde(skip_deserializing, default)]
40    pub from_user_id: u64,
41}
42
43/// 接受好友申请请求
44///
45/// RPC路由: `contact/friend/accept`
46#[derive(Debug, Clone, Serialize, Deserialize)]
47pub struct FriendAcceptRequest {
48    /// 申请者ID
49    pub from_user_id: u64,
50    /// 回复消息
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub message: Option<String>,
53
54    /// 接受者ID(服务器端填充,客户端不可设置)
55    #[serde(skip_deserializing, default)]
56    pub target_user_id: u64,
57}
58
59/// 拒绝好友申请请求
60///
61/// RPC路由: `contact/friend/reject`
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct FriendRejectRequest {
64    /// 申请者ID
65    pub from_user_id: u64,
66    /// 拒绝者ID
67    pub target_user_id: u64,
68    /// 拒绝理由
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub message: Option<String>,
71}
72
73/// 待处理好友请求列表
74///
75/// RPC路由: `contact/friend/pending`
76#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct FriendPendingRequest {
78    /// 用户ID(服务器端填充,客户端不可设置)
79    #[serde(skip_deserializing, default)]
80    pub user_id: u64,
81}
82
83/// 检查好友关系请求
84///
85/// RPC路由: `contact/friend/check`
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct FriendCheckRequest {
88    /// 要检查的用户ID
89    pub friend_id: u64,
90
91    /// 用户ID(服务器端填充,客户端不可设置)
92    #[serde(skip_deserializing, default)]
93    pub user_id: u64,
94}
95
96/// 移除好友请求
97///
98/// RPC路由: `contact/friend/remove`
99#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct FriendRemoveRequest {
101    /// 要移除的好友ID
102    pub friend_id: u64,
103
104    /// 用户ID(服务器端填充,客户端不可设置)
105    #[serde(skip_deserializing, default)]
106    pub user_id: u64,
107}
108
109/// 发送好友申请响应
110///
111/// RPC路由: `contact/friend/apply`
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct FriendApplyResponse {
114    pub user_id: u64,
115    pub username: String,
116    pub status: String,   // "pending"
117    pub added_at: String, // ISO 8601
118    pub message: Option<String>,
119}
120
121/// 接受好友申请响应
122///
123/// RPC路由: `contact/friend/accept`
124/// 返回频道 ID(channel_id),客户端应使用此 ID 发送消息
125pub type FriendAcceptResponse = u64;
126
127/// 拒绝好友申请响应
128///
129/// RPC路由: `contact/friend/reject`
130/// 简单操作,返回 true(成功/失败由协议层 code 处理)
131pub type FriendRejectResponse = bool;
132
133/// 删除好友响应
134///
135/// RPC路由: `contact/friend/remove`
136/// 简单操作,返回 true(成功/失败由协议层 code 处理)
137pub type FriendRemoveResponse = bool;
138
139/// 检查好友关系响应
140///
141/// RPC路由: `contact/friend/check`
142#[derive(Debug, Clone, Serialize, Deserialize)]
143pub struct FriendCheckResponse {
144    pub is_friend: bool,
145    pub status: Option<String>, // "accepted", "pending", "deleted"
146}
147
148/// 待处理好友申请条目
149#[derive(Debug, Clone, Serialize, Deserialize)]
150pub struct FriendPendingItem {
151    pub from_user_id: u64,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub message: Option<String>,
154    pub created_at: String,
155}
156
157/// 待处理好友申请响应
158///
159/// RPC路由: `contact/friend/pending`
160#[derive(Debug, Clone, Serialize, Deserialize)]
161pub struct FriendPendingResponse {
162    pub requests: Vec<FriendPendingItem>, // 注意:服务端返回的是 "requests" 而不是 "pending_requests"
163    pub total: usize,
164}