Skip to main content

cloudreve_sdk_api/models/
explorer.rs

1use crate::models::common::PaginationResults;
2use crate::models::user::User;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// List file service parameters
7#[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
22/// File type constants
23pub mod file_type {
24    pub const FILE: i32 = 0;
25    pub const FOLDER: i32 = 1;
26}
27
28/// File response
29#[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/// Folder summary
58#[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/// Extended file information
68#[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/// Direct link
87#[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/// Entity
97#[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/// Share information
113#[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/// Storage policy type
155#[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/// Storage policy
174#[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/// List response
204#[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/// Navigator properties
226#[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/// Explorer view settings
236#[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/// File thumbnail response
252#[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/// Delete file service
261#[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/// Unlock file service
271#[derive(Debug, Clone, Serialize, Deserialize)]
272pub struct UnlockFileService {
273    pub tokens: Vec<String>,
274}
275
276/// Rename file service
277#[derive(Debug, Clone, Serialize, Deserialize)]
278pub struct RenameFileService {
279    pub uri: String,
280    pub new_name: String,
281}
282
283/// Move file service
284#[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/// Metadata patch
293#[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/// Patch metadata service
303#[derive(Debug, Clone, Serialize, Deserialize)]
304pub struct PatchMetadataService {
305    pub uris: Vec<String>,
306    pub patches: Vec<MetadataPatch>,
307}
308
309/// Permission setting request
310#[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/// Create file service
327#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct CreateFileService {
329    pub uri: String,
330    #[serde(rename = "type")]
331    pub file_type: String, // "file" or "folder"
332    #[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/// File URL service
339#[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/// File URL response
359#[derive(Debug, Clone, Serialize, Deserialize, Default)]
360pub struct FileURLResponse {
361    pub urls: Vec<EntityURLResponse>,
362    pub expires: String,
363}
364
365/// Entity URL response
366#[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/// Get file info service
374#[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/// Version control service
387#[derive(Debug, Clone, Serialize, Deserialize)]
388pub struct VersionControlService {
389    pub uri: String,
390    pub version: String,
391}
392
393/// File update service
394#[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/// Upload credential
402#[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/// Encryption metadata
434#[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/// Encryption cipher
442#[derive(Debug, Clone, Serialize, Deserialize)]
443pub enum EncryptionCipher {
444    #[serde(rename = "aes-256-ctr")]
445    Aes256Ctr,
446}
447
448/// Delete upload session service
449#[derive(Debug, Clone, Serialize, Deserialize)]
450pub struct DeleteUploadSessionService {
451    pub id: String,
452    pub uri: String,
453}
454
455/// Mount policy service
456#[derive(Debug, Clone, Serialize, Deserialize)]
457pub struct MountPolicyService {
458    pub uri: String,
459    pub policy_id: String,
460}
461
462/// Set permission service
463#[derive(Debug, Clone, Serialize, Deserialize)]
464pub struct SetPermissionService {
465    pub uris: Vec<String>,
466    pub setting: PermissionSettingReq,
467}
468
469/// Upload session request
470#[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
489/// Metadata key constants
490pub 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
501/// File permission constants
502pub 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
509/// Navigator capability constants
510pub 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/// File event type for SSE events
538#[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/// File event data received from SSE
548#[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/// SSE event types from the file events endpoint
559#[derive(Debug, Clone)]
560pub enum FileEvent {
561    /// Connection resumed
562    Resumed,
563    /// Subscription confirmed
564    Subscribed,
565    /// Keep-alive ping
566    KeepAlive,
567    /// Reconnect required
568    ReconnectRequired,
569    /// Batch of file events with data
570    Event(Vec<FileEventData>),
571}