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<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}