cloudreve_api/api/v3/
session.rs1use crate::api::v3::models::*;
4use crate::api::v3::ApiV3Client;
5use crate::Error;
6
7impl ApiV3Client {
8 pub async fn login(&mut self, request: &LoginRequest<'_>) -> Result<User, Error> {
10 let url = self.get_url("/user/session");
11 let mut http_request = self.http_client.post(&url).json(request);
12
13 if let Some(cookie) = &self.session_cookie {
14 http_request = http_request.header("Cookie", format!("cloudreve-session={}", cookie));
15 }
16
17 let response = http_request.send().await?;
18
19 if let Some(set_cookie) = response.headers().get("Set-Cookie") {
20 if let Ok(cookie_str) = set_cookie.to_str() {
21 for cookie in cookie_str.split(';').map(|s| s.trim()) {
22 if cookie.starts_with("cloudreve-session=") {
23 let session_value = cookie.trim_start_matches("cloudreve-session=");
24 self.session_cookie = Some(session_value.to_string());
25 break;
26 }
27 }
28 }
29 }
30
31 let _status = response.status();
32 let api_response: ApiResponse<User> = response.json().await?;
33
34 match api_response.data {
35 Some(user) => Ok(user),
36 None => Err(Error::Api {
37 code: api_response.code,
38 message: api_response.msg,
39 }),
40 }
41 }
42
43 pub async fn login_2fa(&mut self, request: &OtpLoginRequest) -> Result<User, Error> {
45 let url = self.get_url("/user/2fa");
46 let mut http_request = self.http_client.post(&url).json(request);
47
48 if let Some(cookie) = &self.session_cookie {
49 http_request = http_request.header("Cookie", format!("cloudreve-session={}", cookie));
50 }
51
52 let response = http_request.send().await?;
53
54 if let Some(set_cookie) = response.headers().get("Set-Cookie") {
55 if let Ok(cookie_str) = set_cookie.to_str() {
56 for cookie in cookie_str.split(';').map(|s| s.trim()) {
57 if cookie.starts_with("cloudreve-session=") {
58 let session_value = cookie.trim_start_matches("cloudreve-session=");
59 self.session_cookie = Some(session_value.to_string());
60 break;
61 }
62 }
63 }
64 }
65
66 let _status = response.status();
67 let api_response: ApiResponse<User> = response.json().await?;
68
69 match api_response.data {
70 Some(user) => Ok(user),
71 None => Err(Error::Api {
72 code: api_response.code,
73 message: api_response.msg,
74 }),
75 }
76 }
77
78 pub async fn logout(&self) -> Result<(), Error> {
80 let response: ApiResponse<()> = self.delete("/user/session").await?;
81 if response.code == 0 {
82 Ok(())
83 } else {
84 Err(Error::Api {
85 code: response.code,
86 message: response.msg,
87 })
88 }
89 }
90}