1use crate::models::common::PaginationResults;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[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#[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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize, Default)]
89pub struct LoginResponse {
90 pub user: User,
91 pub token: Token,
92}
93
94#[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#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct TwoFALoginRequest {
106 pub otp: String,
107 pub session_id: String,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct RefreshTokenRequest {
113 pub refresh_token: String,
114}
115
116#[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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
194pub struct OpenID {
195 pub provider: OpenIDProvider,
196 pub linked_at: String,
197}
198
199#[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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize, Default)]
243pub struct CreditChangeLogResponse {
244 pub changes: Vec<CreditChangeLog>,
245 pub pagination: PaginationResults,
246}
247
248#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
281pub struct ResetPasswordService {
282 pub password: String,
283 pub secret: String,
284}
285
286pub 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}