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        // V3 returns ApiResponse with data as string (download URL path)
65        let response: ApiResponse<String> = self
66            .put(&format!("/file/download/{}", id), &serde_json::json!({}))
67            .await?;
68        match response.data {
69            Some(url_path) => Ok(DownloadUrl { url: url_path }),
70            None => Err(Error::Api {
71                code: response.code,
72                message: response.msg,
73            }),
74        }
75    }
76
77    pub async fn get_file_source(
78        &self,
79        request: &FileSourceRequest,
80    ) -> Result<Vec<FileSource>, Error> {
81        let response: ApiResponse<Vec<FileSource>> = self.post("/file/source", request).await?;
82        match response.data {
83            Some(sources) => Ok(sources),
84            None => Err(Error::Api {
85                code: response.code,
86                message: response.msg,
87            }),
88        }
89    }
90
91    pub async fn preview_file(&self, id: &str) -> Result<DirectoryList, Error> {
92        let response: ApiResponse<DirectoryList> =
93            self.get(&format!("/file/preview/{}", id)).await?;
94        match response.data {
95            Some(list) => Ok(list),
96            None => Err(Error::Api {
97                code: response.code,
98                message: response.msg,
99            }),
100        }
101    }
102
103    pub async fn get_thumbnail(&self, id: &str) -> Result<DirectoryList, Error> {
104        let response: ApiResponse<DirectoryList> = self.get(&format!("/file/thumb/{}", id)).await?;
105        match response.data {
106            Some(list) => Ok(list),
107            None => Err(Error::Api {
108                code: response.code,
109                message: response.msg,
110            }),
111        }
112    }
113
114    pub async fn create_file(&self, request: &CreateFileRequest<'_>) -> Result<(), Error> {
115        let response: ApiResponse<()> = self.post("/file/create", request).await?;
116        if response.code == 0 {
117            Ok(())
118        } else {
119            Err(Error::Api {
120                code: response.code,
121                message: response.msg,
122            })
123        }
124    }
125}