Skip to main content

privchat_protocol/rpc/
qrcode.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路由: `qrcode/generate`
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct QRCodeGenerateRequest {
26    /// 二维码类型(user, group, auth, feature)
27    pub qr_type: String,
28    /// 目标 ID(用户ID/群组ID/会话ID)
29    pub target_id: String,
30    /// 过期时间(秒)
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub expire_seconds: Option<u64>,
33    /// 最大使用次数
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub max_usage: Option<u32>,
36    /// 额外元数据
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub metadata: Option<serde_json::Value>,
39    /// 用户 ID(服务器端填充)
40    #[serde(skip_deserializing, default)]
41    pub user_id: u64,
42}
43
44/// 解析二维码请求
45///
46/// RPC路由: `qrcode/resolve`
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct QRCodeResolveRequest {
49    pub qr_key: String,
50    #[serde(skip_serializing_if = "Option::is_none")]
51    pub token: Option<String>,
52    /// 扫描者 ID(服务器端填充)
53    #[serde(skip_deserializing, default)]
54    pub scanner_id: u64,
55}
56
57/// 刷新二维码请求
58///
59/// RPC路由: `qrcode/refresh`
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct QRCodeRefreshRequest {
62    pub qr_type: String,
63    pub target_id: String,
64    pub creator_id: String,
65}
66
67/// 撤销二维码请求
68///
69/// RPC路由: `qrcode/revoke`
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct QRCodeRevokeRequest {
72    pub qr_key: String,
73    /// 用户 ID(服务器端填充)
74    #[serde(skip_deserializing, default)]
75    pub user_id: u64,
76}
77
78/// 获取二维码列表请求
79///
80/// RPC路由: `qrcode/list`
81#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct QRCodeListRequest {
83    pub creator_id: String,
84    #[serde(default)]
85    pub include_revoked: bool,
86}
87
88/// 生成用户二维码请求
89///
90/// RPC路由: `user/qrcode/generate`
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct UserQRCodeGenerateRequest {
93    /// 过期时间(秒)
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub expire_seconds: Option<u64>,
96    /// 用户ID(服务器端填充)
97    #[serde(skip_deserializing, default)]
98    pub user_id: u64,
99}
100
101/// 刷新用户二维码请求
102///
103/// RPC路由: `user/qrcode/refresh`
104#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct UserQRCodeRefreshRequest {
106    pub user_id: String,
107}
108
109/// 获取用户二维码请求
110///
111/// RPC路由: `user/qrcode/get`
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct UserQRCodeGetRequest {
114    pub user_id: String,
115}
116
117/// 二维码条目
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct QRCodeEntry {
120    pub qr_key: String,
121    pub qr_code: String,
122    pub qr_type: String,
123    pub target_id: String,
124    pub created_at: String,
125    pub expire_at: Option<String>,
126    pub used_count: u32,
127    pub max_usage: Option<u32>,
128    #[serde(default)]
129    pub revoked: bool,
130}
131
132/// 生成二维码响应
133///
134/// RPC路由: `qrcode/generate`
135#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct QRCodeGenerateResponse {
137    pub qr_key: String,
138    pub qr_code: String,
139    pub qr_type: String,
140    pub target_id: u64,
141    pub created_at: String,
142    pub expire_at: Option<String>,
143    pub max_usage: Option<u32>,
144    pub used_count: u32,
145}
146
147/// 解析二维码响应
148///
149/// RPC路由: `qrcode/resolve`
150#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct QRCodeResolveResponse {
152    pub qr_type: String,
153    pub target_id: u64,
154    pub action: String,
155    pub data: Option<serde_json::Value>,
156    pub used_count: u32,
157    pub max_usage: Option<u32>,
158    pub expire_at: Option<String>,
159}
160
161/// 刷新二维码响应
162///
163/// RPC路由: `qrcode/refresh`
164#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct QRCodeRefreshResponse {
166    pub old_qr_key: String,
167    pub new_qr_key: String,
168    pub new_qr_code: String,
169    pub revoked_at: String,
170}
171
172/// 撤销二维码响应
173///
174/// RPC路由: `qrcode/revoke`
175#[derive(Debug, Clone, Serialize, Deserialize)]
176pub struct QRCodeRevokeResponse {
177    pub success: bool,
178    pub qr_key: String,
179    pub revoked_at: String,
180}
181
182/// 获取二维码列表响应
183///
184/// RPC路由: `qrcode/list`
185#[derive(Debug, Clone, Serialize, Deserialize)]
186pub struct QRCodeListResponse {
187    pub qr_keys: Vec<QRCodeEntry>,
188    pub total: usize,
189}
190
191/// 生成用户二维码响应
192///
193/// RPC路由: `user/qrcode/generate`
194#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct UserQRCodeGenerateResponse {
196    pub qr_key: String,
197    pub qr_code: String,
198    pub created_at: String,
199}
200
201/// 刷新用户二维码响应
202///
203/// RPC路由: `user/qrcode/refresh`
204pub type UserQRCodeRefreshResponse = QRCodeRefreshResponse;
205
206/// 获取用户二维码响应
207///
208/// RPC路由: `user/qrcode/get`
209#[derive(Debug, Clone, Serialize, Deserialize)]
210pub struct UserQRCodeGetResponse {
211    pub qr_key: String,
212    pub qr_code: String,
213    pub created_at: String,
214    pub used_count: u32,
215}