cloudreve_api/api/v4/
mod.rs1use crate::Error;
4use log::debug;
5use serde::Serialize;
6
7pub mod file;
9pub mod models;
11pub mod uri;
13pub mod session;
15pub mod share;
17pub mod site;
19pub mod dav;
21pub mod user;
23pub mod workflow;
25
26#[derive(Debug, Clone)]
28pub struct ApiV4Client {
29 pub base_url: String,
31 pub http_client: reqwest::Client,
33 pub token: Option<String>,
35}
36
37impl ApiV4Client {
38 pub fn new(base_url: &str) -> Self {
40 Self {
41 base_url: base_url.to_string(),
42 http_client: reqwest::Client::new(),
43 token: None,
44 }
45 }
46
47 pub fn set_token(&mut self, token: String) {
49 self.token = Some(token);
50 }
51
52 fn get_url(&self, endpoint: &str) -> String {
54 format!(
55 "{}/api/v4/{}",
56 self.base_url.trim_end_matches('/'),
57 endpoint.trim_start_matches('/')
58 )
59 }
60
61 pub async fn get<T>(&self, endpoint: &str) -> Result<T, Error>
63 where
64 T: serde::de::DeserializeOwned + std::fmt::Debug,
65 {
66 let url = self.get_url(endpoint);
67 let mut request = self.http_client.get(&url);
68
69 if let Some(token) = &self.token {
70 request = request.bearer_auth(token);
72 }
73 debug!("GET URL: {}", url);
74
75 let response = request.send().await?;
76 let status = response.status();
77
78 let raw_text = response.text().await?;
80
81 match serde_json::from_str::<T>(&raw_text) {
82 Ok(json) => {
83 debug!("Response status: {}, JSON: {:?}", status, json);
84 Ok(json)
85 }
86 Err(e) => {
87 debug!("JSON parse error: {}, raw response: {}", e, raw_text);
88 Err(Error::Json(e))
89 }
90 }
91 }
92
93 pub async fn post<T>(&self, endpoint: &str, body: &impl Serialize) -> Result<T, Error>
95 where
96 T: serde::de::DeserializeOwned + std::fmt::Debug,
97 {
98 let url = self.get_url(endpoint);
99 let mut request = self.http_client.post(&url).json(body);
100
101 if let Some(token) = &self.token {
102 request = request.bearer_auth(token);
104 }
105
106 debug!("POST URL: {}", url);
107
108 let response = request.send().await?;
109 let status = response.status();
110
111 let raw_text = response.text().await?;
113
114 match serde_json::from_str::<T>(&raw_text) {
115 Ok(json) => {
116 debug!("Response status: {}, JSON: {:?}", status, json);
117 Ok(json)
118 }
119 Err(e) => {
120 debug!("JSON parse error: {}, raw response: {}", e, raw_text);
121 Err(Error::Json(e))
122 }
123 }
124 }
125
126 pub async fn put<T>(&self, endpoint: &str, body: &impl Serialize) -> Result<T, Error>
128 where
129 T: serde::de::DeserializeOwned + std::fmt::Debug,
130 {
131 let url = self.get_url(endpoint);
132 let mut request = self.http_client.put(&url).json(body);
133
134 if let Some(token) = &self.token {
135 request = request.bearer_auth(token);
137 }
138 debug!("PUT URL: {}", url);
139
140 let response = request.send().await?;
141 let status = response.status();
142
143 let raw_text = response.text().await?;
145
146 match serde_json::from_str::<T>(&raw_text) {
147 Ok(json) => {
148 debug!("Response status: {}, JSON: {:?}", status, json);
149 Ok(json)
150 }
151 Err(e) => {
152 debug!("JSON parse error: {}, raw response: {}", e, raw_text);
153 Err(Error::Json(e))
154 }
155 }
156 }
157
158 pub async fn patch<T>(&self, endpoint: &str, body: &impl Serialize) -> Result<T, Error>
159 where
160 T: serde::de::DeserializeOwned + std::fmt::Debug,
161 {
162 let url = self.get_url(endpoint);
163 let mut request = self.http_client.patch(&url).json(body);
164
165 if let Some(token) = &self.token {
166 request = request.bearer_auth(token);
168 }
169 debug!("PATCH URL: {}", url);
170
171 let response = request.send().await?;
172 let status = response.status();
173
174 let raw_text = response.text().await?;
176
177 match serde_json::from_str::<T>(&raw_text) {
178 Ok(json) => {
179 debug!("Response status: {}, JSON: {:?}", status, json);
180 Ok(json)
181 }
182 Err(e) => {
183 debug!("JSON parse error: {}, raw response: {}", e, raw_text);
184 Err(Error::Json(e))
185 }
186 }
187 }
188
189 pub async fn delete<T>(&self, endpoint: &str) -> Result<T, Error>
191 where
192 T: serde::de::DeserializeOwned + std::fmt::Debug,
193 {
194 let url = self.get_url(endpoint);
195 let mut request = self.http_client.delete(&url);
196
197 if let Some(token) = &self.token {
198 request = request.bearer_auth(token);
200 }
201 debug!("DELETE URL: {}", url);
202
203 let response = request.send().await?;
204 let status = response.status();
205
206 let raw_text = response.text().await?;
208
209 match serde_json::from_str::<T>(&raw_text) {
210 Ok(json) => {
211 debug!("Response status: {}, JSON: {:?}", status, json);
212 Ok(json)
213 }
214 Err(e) => {
215 debug!("JSON parse error: {}, raw response: {}", e, raw_text);
216 Err(Error::Json(e))
217 }
218 }
219 }
220}