Skip to main content

privchat_protocol/rpc/message/
status.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路由: `message/status/read`
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct MessageStatusReadRequest {
26    /// 频道ID
27    pub channel_id: u64,
28    /// 服务端消息ID(服务端字段名为 message_id)
29    #[serde(alias = "server_message_id")]
30    pub message_id: u64,
31    /// 用户ID(部分旧服务端会忽略,保持兼容)
32    #[serde(default)]
33    pub user_id: u64,
34}
35
36/// 获取消息已读列表请求
37///
38/// RPC路由: `message/status/read_list`
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct MessageReadListRequest {
41    /// 服务端消息ID(服务端字段名为 message_id)
42    #[serde(alias = "server_message_id")]
43    pub message_id: u64,
44    /// 频道ID
45    pub channel_id: u64,
46}
47
48/// 获取消息已读统计请求
49///
50/// RPC路由: `message/status/read_stats`
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct MessageReadStatsRequest {
53    /// 服务端消息ID(服务端字段名为 message_id)
54    #[serde(alias = "server_message_id")]
55    pub message_id: u64,
56    /// 频道ID
57    pub channel_id: u64,
58}
59
60/// 获取消息未读数请求
61///
62/// RPC路由: `message/status/count`
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct MessageStatusCountRequest {
65    /// 频道ID(为空表示查询总未读)
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub channel_id: Option<u64>,
68}
69
70/// 标记消息已读响应
71///
72/// RPC路由: `message/status/read`
73/// 简单操作,返回 true(成功/失败由协议层 code 处理)
74pub type MessageStatusReadResponse = bool;
75
76/// 获取消息已读列表响应
77///
78/// RPC路由: `message/status/read_list`
79#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct MessageReadUserEntry {
81    pub user_id: u64,
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub username: Option<String>,
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub nickname: Option<String>,
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub avatar_url: Option<String>,
88    #[serde(skip_serializing_if = "Option::is_none")]
89    pub read_at: Option<String>,
90}
91
92/// 获取消息已读列表响应
93///
94/// RPC路由: `message/status/read_list`
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct MessageReadListResponse {
97    #[serde(default, alias = "read_list")]
98    pub readers: Vec<MessageReadUserEntry>,
99    #[serde(default, alias = "total_members")]
100    pub total: usize,
101    #[serde(default)]
102    pub read_count: u32,
103    #[serde(default)]
104    pub unread_count: u32,
105}
106
107/// 获取消息已读统计响应
108///
109/// RPC路由: `message/status/read_stats`
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct MessageReadStatsResponse {
112    pub read_count: u32,
113    #[serde(default, alias = "total_members")]
114    pub total_count: u32,
115}
116
117/// 获取消息未读数响应
118///
119/// RPC路由: `message/status/count`
120#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct MessageStatusCountResponse {
122    pub unread_count: i32,
123    #[serde(default)]
124    pub channel_id: Option<String>,
125}