1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Debug, Serialize, Deserialize)]
8pub struct ApiResponse<T> {
9 pub code: i32,
10 pub msg: String,
11 pub data: Option<T>,
12}
13
14#[derive(Debug, Serialize, Deserialize, Clone)]
16pub struct User {
17 pub id: String,
18 pub user_name: String,
19 pub nickname: String,
20 #[serde(default)]
21 pub status: i32,
22 #[serde(default)]
23 pub avatar: String,
24 pub created_at: String,
25 #[serde(default)]
26 pub preferred_theme: String,
27 #[serde(default)]
28 pub anonymous: bool,
29 pub group: UserGroup,
30 #[serde(default)]
31 pub tags: Vec<String>,
32}
33
34#[derive(Debug, Serialize, Deserialize, Clone)]
36pub struct UserGroup {
37 #[serde(default)]
38 pub id: i32,
39 #[serde(default)]
40 pub name: String,
41 #[serde(default)]
42 pub allow_share: bool,
43 #[serde(default)]
44 pub allow_remote_download: bool,
45 #[serde(default)]
46 pub allow_archive_download: bool,
47 #[serde(default)]
48 pub share_download: bool,
49 #[serde(default)]
50 pub compress: bool,
51 #[serde(default)]
52 pub webdav: bool,
53 #[serde(default)]
54 pub source_batch: i32,
55 #[serde(default)]
56 pub advance_delete: bool,
57 #[serde(default)]
58 pub allow_web_dav_proxy: bool,
59}
60
61#[derive(Debug, Serialize, Deserialize, Clone)]
63pub struct Object {
64 pub id: String,
65 pub name: String,
66 pub path: String,
67 pub thumb: bool,
68 pub size: i64,
69 #[serde(rename = "type")]
70 pub object_type: String,
71 pub date: String,
72 pub create_date: String,
73 pub source_enabled: bool,
74}
75
76#[derive(Debug, Serialize, Deserialize, Clone, Default)]
78pub struct Policy {
79 #[serde(default)]
80 pub id: String,
81 #[serde(default)]
82 pub name: String,
83 #[serde(rename = "type")]
84 #[serde(default)]
85 pub policy_type: String,
86 #[serde(default)]
87 pub max_size: i64,
88 #[serde(default)]
89 pub file_type: Option<Vec<String>>,
90}
91
92#[derive(Debug, Serialize, Deserialize)]
94pub struct Property {
95 pub created_at: String,
96 pub updated_at: String,
97 pub policy: String,
98 pub size: i64,
99 pub child_folder_num: i32,
100 pub child_file_num: i32,
101 pub path: String,
102 pub query_date: String,
103}
104
105#[derive(Debug, Serialize, Deserialize)]
107pub struct DirectoryList {
108 #[serde(default)]
109 pub parent: String,
110 #[serde(default)]
111 pub objects: Vec<Object>,
112 #[serde(default)]
113 pub policy: Policy,
114}
115
116#[derive(Debug, Serialize, Deserialize)]
118pub struct UploadSession {
119 #[serde(rename = "sessionID")]
120 pub session_id: String,
121 #[serde(rename = "chunkSize")]
122 pub chunk_size: i64,
123 pub expires: i64,
124}
125
126#[derive(Debug, Serialize)]
128pub struct UploadFileRequest<'a> {
129 pub path: &'a str,
130 pub size: i64,
131 pub name: &'a str,
132 pub policy_id: &'a str,
133 pub last_modified: i64,
136 pub mime_type: &'a str,
137}
138
139#[derive(Debug, Serialize, Deserialize)]
141pub struct DownloadUrl {
142 pub url: String,
143}
144
145#[derive(Debug, Deserialize)]
147pub struct FileSource {
148 pub url: String,
149 pub name: String,
150 pub parent: i64,
151}
152
153#[derive(Debug, Serialize, Deserialize)]
155pub struct StorageInfo {
156 pub used: i64,
157 pub free: i64,
158 pub total: i64,
159}
160
161#[derive(Debug, Deserialize, Default)]
163pub struct Share {
164 #[serde(default)]
165 pub key: String,
166 #[serde(default)]
167 pub password: String,
168 #[serde(default)]
169 pub is_dir: bool,
170 #[serde(default)]
171 pub downloads: i64,
172 #[serde(default)]
173 pub remain_downloads: i64,
174 #[serde(default)]
175 pub expire: i64,
176 #[serde(default)]
177 pub preview: bool,
178 #[serde(default)]
179 pub owner_id: String,
180 #[serde(default)]
181 pub owner_nick: String,
182 #[serde(default)]
183 pub created_at: String,
184}
185
186#[derive(Debug, Serialize)]
188pub struct ShareRequest {
189 pub id: String,
190 pub is_dir: bool,
191 pub password: String,
192 pub downloads: i32,
193 pub expire: i32,
194 pub preview: bool,
195}
196
197#[derive(Debug, Clone, Serialize, Deserialize, Default)]
199pub struct SiteConfig {
200 #[serde(default)]
201 pub title: String,
202 #[serde(default)]
203 pub login_captcha: bool,
204 #[serde(default)]
205 pub reg_captcha: bool,
206 #[serde(default)]
207 pub forget_captcha: bool,
208 #[serde(default)]
209 pub email_active: bool,
210 #[serde(default)]
211 pub themes: String,
212 #[serde(default)]
213 pub default_theme: String,
214 #[serde(default)]
215 pub home_view_method: String,
216 #[serde(default)]
217 pub share_view_method: String,
218 #[serde(default)]
219 pub authn: bool,
220 #[serde(default)]
221 pub user: Option<User>,
222 #[serde(default)]
223 pub captcha_recaptcha_key: String,
224 #[serde(default)]
225 pub captcha_type: String,
226 #[serde(default)]
227 pub tcaptcha_captcha_app_id: String,
228 #[serde(default)]
229 pub register_enabled: bool,
230 #[serde(default)]
231 pub app_promotion: bool,
232 #[serde(default)]
233 pub wopi_exts: Option<Value>,
234 #[serde(default)]
235 pub direct_link_batch_size: i64,
236}
237
238#[derive(Debug, Serialize)]
240pub struct LoginRequest<'a> {
241 #[serde(rename = "userName")]
242 pub user_name: &'a str,
243 #[serde(rename = "Password")]
244 pub password: &'a str,
245 #[serde(rename = "captchaCode")]
246 pub captcha_code: Option<&'a str>,
247}
248
249#[derive(Debug, Deserialize)]
251pub struct CaptchaResponse {
252 pub image: String,
253 pub ticket: String,
254}
255
256#[derive(Debug, Serialize)]
258pub struct OtpLoginRequest {
259 pub code: String,
260}
261
262#[derive(Debug, Serialize)]
264pub struct CreateDirectoryRequest<'a> {
265 pub path: &'a str,
266}
267
268#[derive(Debug, Serialize)]
270pub struct CreateFileRequest<'a> {
271 pub path: &'a str,
272}
273
274#[derive(Debug, Serialize)]
276pub struct FileSourceRequest {
277 pub items: Vec<String>,
278}
279
280#[derive(Debug, Serialize)]
282pub struct RenameObjectRequest<'a> {
283 pub action: &'a str,
284 pub src: SourceItems<'a>,
285 pub new_name: &'a str,
286}
287
288#[derive(Debug, Serialize)]
290pub struct SourceItems<'a> {
291 pub dirs: Vec<&'a str>,
292 pub items: Vec<&'a str>,
293}
294
295#[derive(Debug, Serialize)]
297pub struct MoveObjectRequest<'a> {
298 pub action: &'a str,
299 pub src_dir: &'a str,
300 pub src: SourceItems<'a>,
301 pub dst: &'a str,
302}
303
304#[derive(Debug, Serialize)]
306pub struct CopyObjectRequest<'a> {
307 pub src_dir: &'a str,
308 pub src: SourceItems<'a>,
309 pub dst: &'a str,
310}
311
312#[derive(Debug, Serialize)]
314pub struct DeleteObjectRequest<'a> {
315 pub items: Vec<&'a str>,
316 pub dirs: Vec<&'a str>,
317 pub force: bool,
318 pub unlink: bool,
319}
320
321pub struct ObjectPropertyRequest<'a> {
323 pub id: &'a str,
324 pub is_folder: Option<bool>,
325 pub trace_root: Option<bool>,
326}
327
328#[derive(Debug, Serialize, Deserialize, Clone, Default)]
332pub struct Aria2DownloadInfo {
333 #[serde(default)]
334 pub gid: String,
335 #[serde(default)]
336 pub status: String,
337 #[serde(default, rename = "totalLength")]
338 pub total_length: String,
339 #[serde(default, rename = "completedLength")]
340 pub completed_length: String,
341 #[serde(default, rename = "uploadLength")]
342 pub upload_length: String,
343 #[serde(default)]
344 pub bitfield: String,
345 #[serde(default, rename = "downloadSpeed")]
346 pub download_speed: String,
347 #[serde(default, rename = "uploadSpeed")]
348 pub upload_speed: String,
349 #[serde(default, rename = "infoHash")]
350 pub info_hash: String,
351 #[serde(default, rename = "numSeeders")]
352 pub num_seeders: String,
353 #[serde(default)]
354 pub seeder: String,
355 #[serde(default, rename = "pieceLength")]
356 pub piece_length: String,
357 #[serde(default, rename = "numPieces")]
358 pub num_pieces: String,
359 #[serde(default)]
360 pub connections: String,
361 #[serde(default, rename = "errorCode")]
362 pub error_code: String,
363 #[serde(default, rename = "errorMessage")]
364 pub error_message: String,
365 #[serde(default, rename = "belongsTo")]
366 pub belongs_to: String,
367 #[serde(default)]
368 pub dir: String,
369 #[serde(default)]
370 pub files: Vec<Aria2File>,
371 #[serde(default)]
372 pub bittorrent: Option<serde_json::Value>,
373}
374
375#[derive(Debug, Serialize, Deserialize, Clone, Default)]
377pub struct Aria2FileUri {
378 #[serde(default)]
379 pub uri: String,
380 #[serde(default)]
381 pub status: String,
382}
383
384#[derive(Debug, Serialize, Deserialize, Clone, Default)]
387pub struct Aria2File {
388 #[serde(default)]
389 pub index: String,
390 #[serde(default)]
391 pub path: String,
392 #[serde(default)]
393 pub length: String,
394 #[serde(default, rename = "completedLength")]
395 pub completed_length: String,
396 #[serde(default, deserialize_with = "deserialize_loose_bool")]
400 pub selected: bool,
401 #[serde(default)]
402 pub uris: Vec<Aria2FileUri>,
403}
404
405fn deserialize_loose_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
406where
407 D: serde::Deserializer<'de>,
408{
409 use serde::de::{Error, Unexpected};
410 let value = Option::<serde_json::Value>::deserialize(deserializer)?;
411 match value {
412 None | Some(serde_json::Value::Null) => Ok(false),
413 Some(serde_json::Value::Bool(b)) => Ok(b),
414 Some(serde_json::Value::String(s)) => match s.trim().to_ascii_lowercase().as_str() {
415 "true" | "1" | "yes" => Ok(true),
416 "false" | "0" | "no" | "" => Ok(false),
417 other => Err(D::Error::invalid_value(
418 Unexpected::Str(other),
419 &"a boolean or boolean-like string",
420 )),
421 },
422 Some(serde_json::Value::Number(n)) => Ok(n.as_i64().map(|x| x != 0).unwrap_or(false)),
423 Some(other) => Err(D::Error::invalid_type(
424 Unexpected::Other(&other.to_string()),
425 &"a boolean",
426 )),
427 }
428}
429
430#[derive(Debug, Serialize, Deserialize, Clone, Default)]
435pub struct Aria2DownloadingTask {
436 #[serde(default)]
437 pub update: String,
438 #[serde(default)]
439 pub interval: i64,
440 #[serde(default)]
441 pub name: String,
442 #[serde(default)]
445 pub status: i32,
446 #[serde(default)]
447 pub dst: String,
448 #[serde(default)]
449 pub total: i64,
450 #[serde(default)]
451 pub downloaded: i64,
452 #[serde(default)]
453 pub speed: i64,
454 #[serde(default)]
455 pub info: Aria2DownloadInfo,
456 #[serde(default)]
457 pub node: String,
458}
459
460#[derive(Debug, Serialize, Deserialize, Clone, Default)]
466pub struct Aria2FinishedTask {
467 #[serde(default)]
468 pub name: String,
469 #[serde(default)]
470 pub gid: String,
471 #[serde(default)]
472 pub status: i32,
473 #[serde(default)]
474 pub dst: String,
475 #[serde(default)]
477 pub error: String,
478 #[serde(default)]
479 pub total: i64,
480 #[serde(default)]
481 pub files: Vec<Aria2File>,
482 #[serde(default)]
484 pub task_status: i32,
485 #[serde(default)]
486 pub task_error: String,
487 #[serde(default)]
489 pub create: String,
490 #[serde(default)]
492 pub update: String,
493 #[serde(default)]
494 pub node: String,
495}
496
497#[derive(Debug, Serialize)]
499pub struct Aria2CreateRequest<'a> {
500 pub dst: &'a str,
501 pub url: Vec<&'a str>,
502}
503
504#[derive(Debug, Serialize, Deserialize, Clone, Default)]
507pub struct UserTask {
508 #[serde(default)]
509 pub id: String,
510 #[serde(default)]
511 pub name: String,
512 #[serde(default)]
514 pub status: i32,
515 #[serde(default, rename = "type")]
517 pub task_type: i32,
518 #[serde(default)]
519 pub create_date: String,
520 #[serde(default)]
521 pub progress: i64,
522 #[serde(default)]
524 pub error: String,
525}
526
527#[derive(Debug, Serialize, Deserialize, Clone, Default)]
529pub struct UserTaskList {
530 #[serde(default)]
531 pub tasks: Vec<UserTask>,
532 #[serde(default)]
533 pub total: i64,
534}
535
536#[derive(Debug, Deserialize)]
538pub struct WebdavAccount {
539 #[serde(rename = "ID")]
540 pub id: i32,
541 #[serde(rename = "Name")]
542 pub name: String,
543 #[serde(rename = "Root")]
544 pub uri: String,
545 #[serde(rename = "Password")]
546 pub password: String,
547 #[serde(rename = "CreatedAt")]
548 pub created_at: String,
549}