1use crate::Error;
4use log::debug;
5use serde::Serialize;
6
7pub mod aria2;
8pub mod directory;
9pub mod file;
10pub mod models;
11pub mod object;
12pub mod session;
13pub mod share;
14pub mod site;
15pub mod user;
16
17#[derive(Debug, Clone)]
19pub struct ApiV3Client {
20 pub base_url: String,
21 pub http_client: reqwest::Client,
22 pub session_cookie: Option<String>,
23}
24
25impl ApiV3Client {
26 pub fn new(base_url: &str) -> Self {
27 Self {
28 base_url: base_url.to_string(),
29 http_client: reqwest::Client::new(),
30 session_cookie: None,
31 }
32 }
33
34 pub fn set_session_cookie(&mut self, cookie: String) {
35 self.session_cookie = Some(cookie);
36 }
37
38 pub fn get_session_cookie(&self) -> Option<&str> {
39 self.session_cookie.as_deref()
40 }
41
42 pub fn clear_session_cookie(&mut self) {
43 self.session_cookie = None;
44 }
45
46 pub fn get_url(&self, endpoint: &str) -> String {
47 format!(
48 "{}/api/v3/{}",
49 self.base_url.trim_end_matches('/'),
50 endpoint.trim_start_matches('/')
51 )
52 }
53
54 pub async fn get<T>(&self, endpoint: &str) -> Result<T, Error>
55 where
56 T: serde::de::DeserializeOwned + std::fmt::Debug,
57 {
58 let url = self.get_url(endpoint);
59 let mut request = self.http_client.get(&url);
60
61 if let Some(cookie) = &self.session_cookie {
62 request = request.header("Cookie", format!("cloudreve-session={}", cookie));
63 debug!("cookie: {}", cookie);
64 }
65
66 debug!("GET URL: {}", url);
67
68 let response = request.send().await?;
69 let status = response.status();
70 let json: T = response.json().await?;
71 debug!("Response status: {}, JSON: {:?}", status, json);
72 Ok(json)
73 }
74
75 pub async fn post<T>(&self, endpoint: &str, body: &impl Serialize) -> Result<T, Error>
76 where
77 T: serde::de::DeserializeOwned + std::fmt::Debug,
78 {
79 let url = self.get_url(endpoint);
80 let mut request = self.http_client.post(&url).json(body);
81
82 if let Some(cookie) = &self.session_cookie {
83 request = request.header("Cookie", format!("cloudreve-session={}", cookie));
84 debug!("cookie: {}", cookie);
85 }
86
87 debug!("POST URL: {}", url);
88
89 let response = request.send().await?;
90 let status = response.status();
91 let json: T = response.json().await?;
92 debug!("Response status: {}, JSON: {:?}", status, json);
93 Ok(json)
94 }
95
96 pub async fn put<T>(&self, endpoint: &str, body: &impl Serialize) -> Result<T, Error>
97 where
98 T: serde::de::DeserializeOwned + std::fmt::Debug,
99 {
100 let url = self.get_url(endpoint);
101 let mut request = self.http_client.put(&url).json(body);
102
103 if let Some(cookie) = &self.session_cookie {
104 request = request.header("Cookie", format!("cloudreve-session={}", cookie));
105 debug!("cookie: {}", cookie);
106 }
107
108 debug!("PUT URL: {}", url);
109
110 let response = request.send().await?;
111 let status = response.status();
112 let json: T = response.json().await?;
113 debug!("Response status: {}, JSON: {:?}", status, json);
114 Ok(json)
115 }
116
117 pub async fn patch<T>(&self, endpoint: &str, body: &impl Serialize) -> Result<T, Error>
118 where
119 T: serde::de::DeserializeOwned + std::fmt::Debug,
120 {
121 let url = self.get_url(endpoint);
122 let mut request = self.http_client.patch(&url).json(body);
123
124 if let Some(cookie) = &self.session_cookie {
125 request = request.header("Cookie", format!("cloudreve-session={}", cookie));
126 debug!("cookie: {}", cookie);
127 }
128
129 debug!("PATCH URL: {}", url);
130
131 let response = request.send().await?;
132 let status = response.status();
133 let json: T = response.json().await?;
134 debug!("Response status: {}, JSON: {:?}", status, json);
135 Ok(json)
136 }
137
138 pub async fn delete<T>(&self, endpoint: &str) -> Result<T, Error>
139 where
140 T: serde::de::DeserializeOwned + std::fmt::Debug,
141 {
142 let url = self.get_url(endpoint);
143 let mut request = self.http_client.delete(&url);
144
145 if let Some(cookie) = &self.session_cookie {
146 request = request.header("Cookie", format!("cloudreve-session={}", cookie));
147 debug!("cookie: {}", cookie);
148 }
149
150 debug!("DELETE URL: {}", url);
151
152 let response = request.send().await?;
153 let status = response.status();
154 let json: T = response.json().await?;
155 debug!("Response status: {}, JSON: {:?}", status, json);
156 Ok(json)
157 }
158
159 pub async fn delete_with_body<T>(
160 &self,
161 endpoint: &str,
162 body: &impl Serialize,
163 ) -> Result<T, Error>
164 where
165 T: serde::de::DeserializeOwned + std::fmt::Debug,
166 {
167 let url = self.get_url(endpoint);
168 let mut request = self.http_client.delete(&url).json(body);
169
170 if let Some(cookie) = &self.session_cookie {
171 request = request.header("Cookie", format!("cloudreve-session={}", cookie));
172 debug!("cookie: {}", cookie);
173 }
174
175 debug!("DELETE WITH BODY URL: {}", url);
176
177 let response = request.send().await?;
178 let status = response.status();
179 let json: T = response.json().await?;
180 debug!("Response status: {}, JSON: {:?}", status, json);
181 Ok(json)
182 }
183
184 pub async fn put_text(&self, endpoint: &str, body: &impl Serialize) -> Result<String, Error> {
186 let url = self.get_url(endpoint);
187 let mut request = self.http_client.put(&url).json(body);
188
189 if let Some(cookie) = &self.session_cookie {
190 request = request.header("Cookie", format!("cloudreve-session={}", cookie));
191 debug!("cookie: {}", cookie);
192 }
193
194 debug!("PUT TEXT URL: {}", url);
195
196 let response = request.send().await?;
197 let status = response.status();
198 let text = response.text().await?;
199 debug!("Response status: {}, Text: {:?}", status, text);
200
201 if !status.is_success() {
202 return Err(Error::Api {
203 code: status.as_u16() as i32,
204 message: text,
205 });
206 }
207
208 Ok(text)
209 }
210}