cloudreve_api/api/v3/
mod.rs

1//! API v3 implementation
2
3use 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/// API v3 client structure
18#[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}