1use crate::models::common::PaginationResults;
2use crate::models::user::User;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct ListFileService {
9 pub uri: String,
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub page: Option<i32>,
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub page_size: Option<i32>,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub order_by: Option<String>,
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub order_direction: Option<String>,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub next_page_token: Option<String>,
20}
21
22pub mod file_type {
24 pub const FILE: i32 = 0;
25 pub const FOLDER: i32 = 1;
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize, Default)]
30pub struct FileResponse {
31 #[serde(rename = "type")]
32 pub file_type: i32,
33 pub id: String,
34 pub name: String,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub permission: Option<String>,
37 pub created_at: String,
38 pub updated_at: String,
39 pub size: i64,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub metadata: Option<HashMap<String, String>>,
42 pub path: String,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub shared: Option<bool>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub capability: Option<String>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub owned: Option<bool>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub folder_summary: Option<FolderSummary>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub extended_info: Option<ExtendedInfo>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub primary_entity: Option<String>,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, Default)]
59pub struct FolderSummary {
60 pub size: i64,
61 pub files: i32,
62 pub folders: i32,
63 pub completed: bool,
64 pub calculated_at: String,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, Default)]
69pub struct ExtendedInfo {
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub storage_policy: Option<StoragePolicy>,
72 pub storage_policy_inherited: bool,
73 pub storage_used: i64,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub shares: Option<Vec<Share>>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub entities: Option<Vec<Entity>>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub permissions: Option<PermissionSettingReq>,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub view: Option<ExplorerView>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub direct_links: Option<Vec<DirectLink>>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize, Default)]
88pub struct DirectLink {
89 pub id: String,
90 pub created_at: String,
91 pub url: String,
92 #[serde(default)]
93 pub downloaded: i32,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize, Default)]
98pub struct Entity {
99 pub id: String,
100 #[serde(rename = "type")]
101 pub entity_type: i32,
102 pub created_at: String,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub storage_policy: Option<StoragePolicy>,
105 pub size: i64,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub created_by: Option<User>,
108 #[serde(skip_serializing_if = "Option::is_none")]
109 pub encrypted_with: Option<EncryptionCipher>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize, Default)]
114pub struct Share {
115 pub id: String,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub name: Option<String>,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub expires: Option<String>,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub is_private: Option<bool>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub share_view: Option<bool>,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub remain_downloads: Option<i32>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub created_at: Option<String>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub price: Option<i32>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub permission_setting: Option<PermissionSettingReq>,
132 pub url: String,
133 pub visited: i32,
134 #[serde(default)]
135 pub downloaded: i32,
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub expired: Option<bool>,
138 pub unlocked: bool,
139 #[serde(default)]
140 pub password_protected: bool,
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub source_type: Option<i32>,
143 pub owner: User,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub permissions: Option<String>,
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub source_uri: Option<String>,
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub password: Option<String>,
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub show_readme: Option<bool>,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize, Default)]
156#[serde(rename_all = "lowercase")]
157pub enum PolicyType {
158 #[default]
159 Local,
160 Remote,
161 Oss,
162 Qiniu,
163 Onedrive,
164 Cos,
165 Upyun,
166 S3,
167 Ks3,
168 Obs,
169 #[serde(rename = "load_balance")]
170 LoadBalance,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize, Default)]
175pub struct StoragePolicy {
176 pub id: String,
177 pub name: String,
178 #[serde(skip_serializing_if = "Option::is_none")]
179 pub allowed_suffix: Option<Vec<String>>,
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub denied_suffix: Option<Vec<String>>,
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub allowed_name_regexp: Option<String>,
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub denied_name_regexp: Option<String>,
186 pub max_size: i64,
187 #[serde(rename = "type")]
188 pub policy_type: PolicyType,
189 #[serde(skip_serializing_if = "Option::is_none")]
190 pub relay: Option<bool>,
191 #[serde(skip_serializing_if = "Option::is_none")]
192 pub weight: Option<i32>,
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub children: Option<Vec<StoragePolicy>>,
195 #[serde(skip_serializing_if = "Option::is_none")]
196 pub chunk_concurrency: Option<i32>,
197 #[serde(skip_serializing_if = "Option::is_none")]
198 pub encryption: Option<bool>,
199 #[serde(skip_serializing_if = "Option::is_none")]
200 pub streaming_encryption: Option<bool>,
201}
202
203#[derive(Debug, Clone, Serialize, Deserialize, Default)]
205pub struct ListResponse {
206 pub files: Vec<FileResponse>,
207 pub pagination: PaginationResults,
208 pub props: NavigatorProps,
209 #[serde(skip_serializing_if = "Option::is_none")]
210 pub context_hint: Option<String>,
211 #[serde(skip_serializing_if = "Option::is_none")]
212 pub recursion_limit_reached: Option<bool>,
213 #[serde(skip_serializing_if = "Option::is_none")]
214 pub mixed_type: Option<bool>,
215 #[serde(skip_serializing_if = "Option::is_none")]
216 pub single_file_view: Option<bool>,
217 #[serde(skip_serializing_if = "Option::is_none")]
218 pub parent: Option<FileResponse>,
219 #[serde(skip_serializing_if = "Option::is_none")]
220 pub storage_policy: Option<StoragePolicy>,
221 #[serde(skip_serializing_if = "Option::is_none")]
222 pub view: Option<ExplorerView>,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize, Default)]
227pub struct NavigatorProps {
228 #[serde(skip_serializing_if = "Option::is_none")]
229 pub capability: Option<String>,
230 pub max_page_size: i32,
231 pub order_by_options: Vec<String>,
232 pub order_direction_options: Vec<String>,
233}
234
235#[derive(Debug, Clone, Serialize, Deserialize, Default)]
237pub struct ExplorerView {
238 pub page_size: i32,
239 #[serde(skip_serializing_if = "Option::is_none")]
240 pub order: Option<String>,
241 #[serde(skip_serializing_if = "Option::is_none")]
242 pub order_direction: Option<String>,
243 #[serde(skip_serializing_if = "Option::is_none")]
244 pub view: Option<String>,
245 #[serde(skip_serializing_if = "Option::is_none")]
246 pub thumbnail: Option<bool>,
247 #[serde(skip_serializing_if = "Option::is_none")]
248 pub gallery_width: Option<i32>,
249}
250
251#[derive(Debug, Clone, Serialize, Deserialize, Default)]
253pub struct FileThumbResponse {
254 pub url: String,
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub expires: Option<String>,
257 pub obfuscated: bool,
258}
259
260#[derive(Debug, Clone, Serialize, Deserialize)]
262pub struct DeleteFileService {
263 pub uris: Vec<String>,
264 #[serde(skip_serializing_if = "Option::is_none")]
265 pub unlink: Option<bool>,
266 #[serde(skip_serializing_if = "Option::is_none")]
267 pub skip_soft_delete: Option<bool>,
268}
269
270#[derive(Debug, Clone, Serialize, Deserialize)]
272pub struct UnlockFileService {
273 pub tokens: Vec<String>,
274}
275
276#[derive(Debug, Clone, Serialize, Deserialize)]
278pub struct RenameFileService {
279 pub uri: String,
280 pub new_name: String,
281}
282
283#[derive(Debug, Clone, Serialize, Deserialize)]
285pub struct MoveFileService {
286 pub uris: Vec<String>,
287 pub dst: String,
288 #[serde(skip_serializing_if = "Option::is_none")]
289 pub copy: Option<bool>,
290}
291
292#[derive(Debug, Clone, Serialize, Deserialize)]
294pub struct MetadataPatch {
295 pub key: String,
296 #[serde(skip_serializing_if = "Option::is_none")]
297 pub value: Option<String>,
298 #[serde(skip_serializing_if = "Option::is_none")]
299 pub remove: Option<bool>,
300}
301
302#[derive(Debug, Clone, Serialize, Deserialize)]
304pub struct PatchMetadataService {
305 pub uris: Vec<String>,
306 pub patches: Vec<MetadataPatch>,
307}
308
309#[derive(Debug, Clone, Serialize, Deserialize, Default)]
311pub struct PermissionSettingReq {
312 #[serde(skip_serializing_if = "Option::is_none")]
313 pub same_group: Option<String>,
314 #[serde(skip_serializing_if = "Option::is_none")]
315 pub everyone: Option<String>,
316 #[serde(skip_serializing_if = "Option::is_none")]
317 pub other: Option<String>,
318 #[serde(skip_serializing_if = "Option::is_none")]
319 pub anonymous: Option<String>,
320 #[serde(skip_serializing_if = "Option::is_none")]
321 pub group_explicit: Option<HashMap<String, String>>,
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub user_explicit: Option<HashMap<String, String>>,
324}
325
326#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct CreateFileService {
329 pub uri: String,
330 #[serde(rename = "type")]
331 pub file_type: String, #[serde(skip_serializing_if = "Option::is_none")]
333 pub err_on_conflict: Option<bool>,
334 #[serde(skip_serializing_if = "Option::is_none")]
335 pub metadata: Option<HashMap<String, String>>,
336}
337
338#[derive(Debug, Default, Clone, Serialize, Deserialize)]
340pub struct FileURLService {
341 pub uris: Vec<String>,
342 #[serde(skip_serializing_if = "Option::is_none")]
343 pub download: Option<bool>,
344 #[serde(skip_serializing_if = "Option::is_none")]
345 pub redirect: Option<bool>,
346 #[serde(skip_serializing_if = "Option::is_none")]
347 pub entity: Option<String>,
348 #[serde(skip_serializing_if = "Option::is_none")]
349 pub no_cache: Option<bool>,
350 #[serde(skip_serializing_if = "Option::is_none")]
351 pub skip_error: Option<bool>,
352 #[serde(skip_serializing_if = "Option::is_none")]
353 pub use_primary_site_url: Option<bool>,
354 #[serde(skip_serializing_if = "Option::is_none")]
355 pub archive: Option<bool>,
356}
357
358#[derive(Debug, Clone, Serialize, Deserialize, Default)]
360pub struct FileURLResponse {
361 pub urls: Vec<EntityURLResponse>,
362 pub expires: String,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize, Default)]
367pub struct EntityURLResponse {
368 pub url: String,
369 #[serde(skip_serializing_if = "Option::is_none")]
370 pub stream_saver_display_name: Option<String>,
371}
372
373#[derive(Debug, Clone, Serialize, Deserialize, Default)]
375pub struct GetFileInfoService {
376 #[serde(skip_serializing_if = "Option::is_none")]
377 pub uri: Option<String>,
378 #[serde(skip_serializing_if = "Option::is_none")]
379 pub id: Option<String>,
380 #[serde(skip_serializing_if = "Option::is_none")]
381 pub extended: Option<bool>,
382 #[serde(skip_serializing_if = "Option::is_none")]
383 pub folder_summary: Option<bool>,
384}
385
386#[derive(Debug, Clone, Serialize, Deserialize)]
388pub struct VersionControlService {
389 pub uri: String,
390 pub version: String,
391}
392
393#[derive(Debug, Clone, Serialize, Deserialize)]
395pub struct FileUpdateService {
396 pub uri: String,
397 #[serde(skip_serializing_if = "Option::is_none")]
398 pub previous: Option<String>,
399}
400
401#[derive(Debug, Clone, Serialize, Deserialize, Default)]
403pub struct UploadCredential {
404 pub session_id: String,
405 pub expires: i64,
406 pub chunk_size: i64,
407 #[serde(skip_serializing_if = "Option::is_none")]
408 pub upload_urls: Option<Vec<String>>,
409 #[serde(default)]
410 pub credential: String,
411 #[serde(default)]
412 pub upload_id: String,
413 pub callback_secret: String,
414 #[serde(skip_serializing_if = "Option::is_none")]
415 pub ak: Option<String>,
416 #[serde(rename = "keyTime")]
417 #[serde(skip_serializing_if = "Option::is_none")]
418 pub key_time: Option<String>,
419 #[serde(rename = "completeURL")]
420 #[serde(skip_serializing_if = "Option::is_none")]
421 pub complete_url: Option<String>,
422 #[serde(skip_serializing_if = "Option::is_none")]
423 pub storage_policy: Option<StoragePolicy>,
424 pub uri: String,
425 #[serde(skip_serializing_if = "Option::is_none")]
426 pub mime_type: Option<String>,
427 #[serde(skip_serializing_if = "Option::is_none")]
428 pub upload_policy: Option<String>,
429 #[serde(skip_serializing_if = "Option::is_none")]
430 pub encrypt_metadata: Option<EncryptMetadata>,
431}
432
433#[derive(Debug, Clone, Serialize, Deserialize)]
435pub struct EncryptMetadata {
436 pub algorithm: EncryptionCipher,
437 pub key_plain_text: String,
438 pub iv: String,
439}
440
441#[derive(Debug, Clone, Serialize, Deserialize)]
443pub enum EncryptionCipher {
444 #[serde(rename = "aes-256-ctr")]
445 Aes256Ctr,
446}
447
448#[derive(Debug, Clone, Serialize, Deserialize)]
450pub struct DeleteUploadSessionService {
451 pub id: String,
452 pub uri: String,
453}
454
455#[derive(Debug, Clone, Serialize, Deserialize)]
457pub struct MountPolicyService {
458 pub uri: String,
459 pub policy_id: String,
460}
461
462#[derive(Debug, Clone, Serialize, Deserialize)]
464pub struct SetPermissionService {
465 pub uris: Vec<String>,
466 pub setting: PermissionSettingReq,
467}
468
469#[derive(Debug, Clone, Serialize, Deserialize)]
471pub struct UploadSessionRequest {
472 pub uri: String,
473 pub size: i64,
474 pub policy_id: String,
475 #[serde(skip_serializing_if = "Option::is_none")]
476 pub last_modified: Option<i64>,
477 #[serde(skip_serializing_if = "Option::is_none")]
478 pub entity_type: Option<String>,
479 #[serde(skip_serializing_if = "Option::is_none")]
480 pub metadata: Option<HashMap<String, String>>,
481 #[serde(skip_serializing_if = "Option::is_none")]
482 pub mime_type: Option<String>,
483 #[serde(skip_serializing_if = "Option::is_none")]
484 pub encryption_supported: Option<Vec<EncryptionCipher>>,
485 #[serde(skip_serializing_if = "Option::is_none")]
486 pub previous: Option<String>,
487}
488
489pub mod metadata {
491 pub const SHARE_REDIRECT: &str = "sys:shared_redirect";
492 pub const SHARE_OWNER: &str = "sys:shared_owner";
493 pub const UPLOAD_SESSION_ID: &str = "sys:upload_session_id";
494 pub const ICON_COLOR: &str = "customize:icon_color";
495 pub const EMOJI: &str = "customize:emoji";
496 pub const LIVE_PHOTO: &str = "customize:live_photo";
497 pub const TAG_PREFIX: &str = "tag:";
498 pub const THUMBNAIL_DISABLED: &str = "thumb:disabled";
499}
500
501pub mod file_permission {
503 pub const READ: i32 = 0;
504 pub const UPDATE: i32 = 1;
505 pub const CREATE: i32 = 2;
506 pub const DELETE: i32 = 3;
507}
508
509pub mod navigator_capability {
511 pub const CREATE_FILE: i32 = 0;
512 pub const RENAME_FILE: i32 = 1;
513 pub const SET_PERMISSION: i32 = 2;
514 pub const MOVE_TO_MY: i32 = 3;
515 pub const MOVE_TO_SHARE: i32 = 4;
516 pub const MOVE_TO_TRASH: i32 = 5;
517 pub const UPLOAD_FILE: i32 = 6;
518 pub const DOWNLOAD_FILE: i32 = 7;
519 pub const UPDATE_METADATA: i32 = 8;
520 pub const LIST_CHILDREN: i32 = 9;
521 pub const GENERATE_THUMB: i32 = 10;
522 pub const COPY_TO_MY: i32 = 11;
523 pub const COPY_TO_SHARE: i32 = 12;
524 pub const COPY_TO_TRASH: i32 = 13;
525 pub const DELETE_FILE: i32 = 14;
526 pub const LOCK_FILE: i32 = 15;
527 pub const SOFT_DELETE: i32 = 16;
528 pub const RESTORE: i32 = 17;
529 pub const SHARE: i32 = 18;
530 pub const INFO: i32 = 19;
531 pub const VERSION_CONTROL: i32 = 20;
532 pub const MOUNT: i32 = 21;
533 pub const RELOCATE: i32 = 22;
534 pub const ENTER_FOLDER: i32 = 23;
535}
536
537#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
539#[serde(rename_all = "lowercase")]
540pub enum FileEventType {
541 Create,
542 Modify,
543 Rename,
544 Delete,
545}
546
547#[derive(Debug, Clone, Serialize, Deserialize)]
549pub struct FileEventData {
550 #[serde(rename = "type")]
551 pub event_type: FileEventType,
552 pub file_id: String,
553 pub from: String,
554 #[serde(default)]
555 pub to: String,
556}
557
558#[derive(Debug, Clone)]
560pub enum FileEvent {
561 Resumed,
563 Subscribed,
565 KeepAlive,
567 ReconnectRequired,
569 Event(Vec<FileEventData>),
571}