Skip to main content

cloudreve_sdk_api/models/
user.rs

1use crate::models::common::PaginationResults;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5/// User model
6#[derive(Debug, Clone, Serialize, Deserialize, Default)]
7pub struct User {
8    pub id: String,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub email: Option<String>,
11    pub nickname: String,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub status: Option<String>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub avatar: Option<String>,
16    pub created_at: String,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub preferred_theme: Option<String>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub credit: Option<i32>,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub anonymous: Option<bool>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub group: Option<Group>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub pined: Option<Vec<PinedFile>>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub language: Option<String>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub disable_view_sync: Option<bool>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub share_links_in_profile: Option<ShareLinksInProfileLevel>,
33}
34
35/// User group
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct Group {
38    pub id: String,
39    pub name: String,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub permission: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub direct_link_batch_size: Option<i32>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub trash_retention: Option<i32>,
46}
47
48/// Pinned file
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct PinedFile {
51    pub uri: String,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub name: Option<String>,
54}
55
56/// Share links visibility level
57#[derive(Debug, Clone, Serialize, Deserialize, Default)]
58#[serde(rename_all = "snake_case")]
59pub enum ShareLinksInProfileLevel {
60    #[serde(rename = "")]
61    #[default]
62    PublicShareOnly,
63    AllShare,
64    HideShare,
65}
66
67/// Authentication token
68#[derive(Clone, Serialize, Deserialize, Default)]
69pub struct Token {
70    pub access_token: String,
71    pub refresh_token: String,
72    pub access_expires: String,
73    pub refresh_expires: String,
74}
75
76impl std::fmt::Debug for Token {
77    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
78        f.debug_struct("Token")
79            .field("access_token", &"[REDACTED]")
80            .field("refresh_token", &"[REDACTED]")
81            .field("access_expires", &self.access_expires)
82            .field("refresh_expires", &self.refresh_expires)
83            .finish()
84    }
85}
86
87/// Login response
88#[derive(Debug, Clone, Serialize, Deserialize, Default)]
89pub struct LoginResponse {
90    pub user: User,
91    pub token: Token,
92}
93
94/// Password login request
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct PasswordLoginRequest {
97    pub email: String,
98    pub password: String,
99    #[serde(flatten)]
100    pub captcha: Option<HashMap<String, serde_json::Value>>,
101}
102
103/// 2FA login request
104#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct TwoFALoginRequest {
106    pub otp: String,
107    pub session_id: String,
108}
109
110/// Refresh token request
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct RefreshTokenRequest {
113    pub refresh_token: String,
114}
115
116/// User capacity information
117#[derive(Debug, Clone, Serialize, Deserialize, Default)]
118pub struct Capacity {
119    pub total: i64,
120    pub used: i64,
121    #[serde(default)]
122    pub storage_pack_total: i64,
123}
124
125/// User settings
126#[derive(Debug, Clone, Serialize, Deserialize, Default)]
127pub struct UserSettings {
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub group_expires: Option<String>,
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub open_id: Option<Vec<OpenID>>,
132    pub version_retention_enabled: bool,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub version_retention_ext: Option<Vec<String>>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub version_retention_max: Option<i32>,
137    pub passwordless: bool,
138    pub two_fa_enabled: bool,
139    #[serde(skip_serializing_if = "Option::is_none")]
140    pub passkeys: Option<Vec<Passkey>>,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    pub login_activity: Option<Vec<LoginActivity>>,
143    #[serde(skip_serializing_if = "Option::is_none")]
144    pub storage_packs: Option<Vec<StoragePack>>,
145    pub credit: i32,
146    pub disable_view_sync: bool,
147    pub share_links_in_profile: ShareLinksInProfileLevel,
148}
149
150/// Patch user settings request
151#[derive(Debug, Clone, Serialize, Deserialize, Default)]
152pub struct PatchUserSetting {
153    #[serde(skip_serializing_if = "Option::is_none")]
154    pub nick: Option<String>,
155    #[serde(skip_serializing_if = "Option::is_none")]
156    pub group_expires: Option<bool>,
157    #[serde(skip_serializing_if = "Option::is_none")]
158    pub language: Option<String>,
159    #[serde(skip_serializing_if = "Option::is_none")]
160    pub preferred_theme: Option<String>,
161    #[serde(skip_serializing_if = "Option::is_none")]
162    pub version_retention_enabled: Option<bool>,
163    #[serde(skip_serializing_if = "Option::is_none")]
164    pub version_retention_ext: Option<Vec<String>>,
165    #[serde(skip_serializing_if = "Option::is_none")]
166    pub version_retention_max: Option<i32>,
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub current_password: Option<String>,
169    #[serde(skip_serializing_if = "Option::is_none")]
170    pub new_password: Option<String>,
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub two_fa_enabled: Option<bool>,
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub two_fa_code: Option<String>,
175    #[serde(skip_serializing_if = "Option::is_none")]
176    pub disable_view_sync: Option<bool>,
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub share_links_in_profile: Option<ShareLinksInProfileLevel>,
179}
180
181/// OpenID provider
182#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
183pub enum OpenIDProvider {
184    #[serde(rename = "0")]
185    Logto = 0,
186    #[serde(rename = "1")]
187    QQ = 1,
188    #[serde(rename = "2")]
189    OIDC = 2,
190}
191
192/// OpenID information
193#[derive(Debug, Clone, Serialize, Deserialize)]
194pub struct OpenID {
195    pub provider: OpenIDProvider,
196    pub linked_at: String,
197}
198
199/// Passkey information
200#[derive(Debug, Clone, Serialize, Deserialize)]
201pub struct Passkey {
202    pub id: String,
203    pub name: String,
204    pub created_at: String,
205    pub used_at: String,
206}
207
208/// Login activity
209#[derive(Debug, Clone, Serialize, Deserialize)]
210pub struct LoginActivity {
211    pub created_at: String,
212    pub ip: String,
213    pub browser: String,
214    pub device: String,
215    pub os: String,
216    pub login_with: String,
217    pub open_id_provider: i32,
218    #[serde(skip_serializing_if = "Option::is_none")]
219    pub passkey: Option<String>,
220    pub success: bool,
221    pub webdav: bool,
222}
223
224/// Storage pack information
225#[derive(Debug, Clone, Serialize, Deserialize)]
226pub struct StoragePack {
227    pub name: String,
228    pub active_since: String,
229    pub expire_at: String,
230    pub size: i64,
231}
232
233/// Credit change log entry
234#[derive(Debug, Clone, Serialize, Deserialize, Default)]
235pub struct CreditChangeLog {
236    pub changed_at: String,
237    pub diff: i32,
238    pub reason: String,
239}
240
241/// Credit change log response
242#[derive(Debug, Clone, Serialize, Deserialize, Default)]
243pub struct CreditChangeLogResponse {
244    pub changes: Vec<CreditChangeLog>,
245    pub pagination: PaginationResults,
246}
247
248/// Get credit log service parameters
249#[derive(Debug, Clone, Serialize, Deserialize, Default)]
250pub struct GetCreditLogService {
251    #[serde(skip_serializing_if = "Option::is_none")]
252    pub page_size: Option<i32>,
253    #[serde(skip_serializing_if = "Option::is_none")]
254    pub order_by: Option<String>,
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub order_direction: Option<String>,
257    #[serde(skip_serializing_if = "Option::is_none")]
258    pub next_page_token: Option<String>,
259}
260
261/// Sign up request
262#[derive(Debug, Clone, Serialize, Deserialize)]
263pub struct SignUpService {
264    pub email: String,
265    pub password: String,
266    pub language: String,
267    #[serde(flatten)]
268    pub captcha: Option<HashMap<String, serde_json::Value>>,
269}
270
271/// Send reset email request
272#[derive(Debug, Clone, Serialize, Deserialize)]
273pub struct SendResetEmailService {
274    pub email: String,
275    #[serde(flatten)]
276    pub captcha: Option<HashMap<String, serde_json::Value>>,
277}
278
279/// Reset password request
280#[derive(Debug, Clone, Serialize, Deserialize)]
281pub struct ResetPasswordService {
282    pub password: String,
283    pub secret: String,
284}
285
286/// Group permissions constants
287pub mod group_permission {
288    pub const IS_ADMIN: i32 = 0;
289    pub const IS_ANONYMOUS: i32 = 1;
290    pub const SHARE: i32 = 2;
291    pub const WEBDAV: i32 = 3;
292    pub const ARCHIVE_DOWNLOAD: i32 = 4;
293    pub const ARCHIVE_TASK: i32 = 5;
294    pub const WEBDAV_PROXY: i32 = 6;
295    pub const SHARE_DOWNLOAD: i32 = 7;
296    pub const SHARE_FREE: i32 = 8;
297    pub const REMOTE_DOWNLOAD: i32 = 9;
298    pub const RELOCATE: i32 = 10;
299    pub const REDIRECTED_SOURCE: i32 = 11;
300    pub const ADVANCE_DELETE: i32 = 12;
301    pub const SELECT_NODE: i32 = 13;
302    pub const SET_ANONYMOUS_PERMISSION: i32 = 14;
303    pub const SET_EXPLICIT_USER_PERMISSION: i32 = 15;
304    pub const IGNORE_FILE_PERMISSION: i32 = 16;
305    pub const UNIQUE_DIRECT_LINK: i32 = 17;
306}