cloudreve_api/api/v3/
file.rs

1//! File-related API endpoints for Cloudreve API v3
2
3use crate::api::v3::models::*;
4use crate::api::v3::ApiV3Client;
5use crate::Error;
6
7impl ApiV3Client {
8    pub async fn upload_file(
9        &self,
10        request: &UploadFileRequest<'_>,
11    ) -> Result<UploadSession, Error> {
12        let response: ApiResponse<UploadSession> = self.put("/file/upload", request).await?;
13        match response.data {
14            Some(session) => Ok(session),
15            None => Err(Error::Api {
16                code: response.code,
17                message: response.msg,
18            }),
19        }
20    }
21
22    pub async fn complete_upload(&self, session_id: &str) -> Result<(), Error> {
23        let response: ApiResponse<()> = self
24            .post(
25                &format!("/callback/onedrive/finish/{}", session_id),
26                &serde_json::json!({}),
27            )
28            .await?;
29        if response.code == 0 {
30            Ok(())
31        } else {
32            Err(Error::Api {
33                code: response.code,
34                message: response.msg,
35            })
36        }
37    }
38
39    pub async fn upload_chunk(
40        &self,
41        session_id: &str,
42        _chunk_index: u32,
43        data: Vec<u8>,
44    ) -> Result<(), Error> {
45        let url = self.get_url(&format!("/file/upload/{}/0", session_id));
46        let mut request = self.http_client.post(&url).body(data);
47
48        if let Some(cookie) = &self.session_cookie {
49            request = request.header("Cookie", format!("cloudreve-session={}", cookie));
50        }
51
52        let response = request.send().await?;
53        if response.status().is_success() {
54            Ok(())
55        } else {
56            Err(Error::Api {
57                code: -1,
58                message: format!("Upload failed with status: {}", response.status()),
59            })
60        }
61    }
62
63    pub async fn download_file(&self, id: &str) -> Result<DownloadUrl, Error> {
64        let response: ApiResponse<DownloadUrl> = self
65            .put(&format!("/file/download/{}", id), &serde_json::json!({}))
66            .await?;
67        match response.data {
68            Some(url) => Ok(url),
69            None => Err(Error::Api {
70                code: response.code,
71                message: response.msg,
72            }),
73        }
74    }
75
76    pub async fn get_file_source(
77        &self,
78        request: &FileSourceRequest,
79    ) -> Result<Vec<FileSource>, Error> {
80        let response: ApiResponse<Vec<FileSource>> = self.post("/file/source", request).await?;
81        match response.data {
82            Some(sources) => Ok(sources),
83            None => Err(Error::Api {
84                code: response.code,
85                message: response.msg,
86            }),
87        }
88    }
89
90    pub async fn preview_file(&self, id: &str) -> Result<DirectoryList, Error> {
91        let response: ApiResponse<DirectoryList> =
92            self.get(&format!("/file/preview/{}", id)).await?;
93        match response.data {
94            Some(list) => Ok(list),
95            None => Err(Error::Api {
96                code: response.code,
97                message: response.msg,
98            }),
99        }
100    }
101
102    pub async fn get_thumbnail(&self, id: &str) -> Result<DirectoryList, Error> {
103        let response: ApiResponse<DirectoryList> = self.get(&format!("/file/thumb/{}", id)).await?;
104        match response.data {
105            Some(list) => Ok(list),
106            None => Err(Error::Api {
107                code: response.code,
108                message: response.msg,
109            }),
110        }
111    }
112
113    pub async fn create_file(&self, request: &CreateFileRequest<'_>) -> Result<(), Error> {
114        let response: ApiResponse<()> = self.post("/file/create", request).await?;
115        if response.code == 0 {
116            Ok(())
117        } else {
118            Err(Error::Api {
119                code: response.code,
120                message: response.msg,
121            })
122        }
123    }
124}