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