cloudreve_api/api/v3/
file.rs1use 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<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}