cloudreve_api/api/v3/
session.rs

1//! Session and authentication management for Cloudreve API v3
2
3use crate::api::v3::models::*;
4use crate::api::v3::ApiV3Client;
5use crate::Error;
6
7impl ApiV3Client {
8    /// Login with email and password
9    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    /// Login with OTP (Two-Factor Authentication)
44    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    /// Logout from current session
79    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}