cloudreve_api/api/v4/
session.rs1use crate::api::v4::models::*;
4use crate::api::v4::ApiV4Client;
5use crate::Error;
6
7impl ApiV4Client {
8 pub async fn prepare_login(&self, email: &str) -> Result<LoginPreparation, Error> {
9 let endpoint = format!("/session/prepare?email={}", email);
10 let response: crate::ApiResponse<LoginPreparation> = self.get(&endpoint).await?;
11 match response.data {
12 Some(preparation) => Ok(preparation),
13 None => Err(crate::Error::Api {
14 code: response.code,
15 message: response.msg,
16 }),
17 }
18 }
19
20 pub async fn prepare_openid_signin(
21 &self,
22 request: &OpenIdPrepareRequest<'_>,
23 ) -> Result<String, Error> {
24 let response: crate::ApiResponse<String> = self.put("/session/openid", request).await?;
25 match response.data {
26 Some(url) => Ok(url),
27 None => Err(crate::Error::Api {
28 code: response.code,
29 message: response.msg,
30 }),
31 }
32 }
33
34 pub async fn finish_openid_signin(
35 &self,
36 request: &OpenIdFinishRequest<'_>,
37 ) -> Result<LoginResponse, Error> {
38 let response: crate::ApiResponse<LoginResponse> =
39 self.post("/session/openid", request).await?;
40 match response.data {
41 Some(login_response) => Ok(login_response),
42 None => Err(crate::Error::Api {
43 code: response.code,
44 message: response.msg,
45 }),
46 }
47 }
48
49 pub async fn unlink_openid(&self, provider_id: i32) -> Result<(), Error> {
50 let endpoint = format!("/session/openid/{}", provider_id);
51 let response: crate::ApiResponse<()> = self.delete(&endpoint).await?;
52 if response.code == 0 {
53 Ok(())
54 } else {
55 Err(crate::Error::Api {
56 code: response.code,
57 message: response.msg,
58 })
59 }
60 }
61
62 pub async fn prepare_passkey_signin(&self) -> Result<PasskeySignInPreparation, Error> {
63 let response: crate::ApiResponse<PasskeySignInPreparation> =
64 self.put("/session/authn", &()).await?;
65 match response.data {
66 Some(preparation) => Ok(preparation),
67 None => Err(crate::Error::Api {
68 code: response.code,
69 message: response.msg,
70 }),
71 }
72 }
73
74 pub async fn finish_passkey_signin(
75 &self,
76 request: &PasskeySignInRequest<'_>,
77 ) -> Result<LoginResponse, Error> {
78 let response: crate::ApiResponse<LoginResponse> =
79 self.post("/session/authn", request).await?;
80 match response.data {
81 Some(login_response) => Ok(login_response),
82 None => Err(crate::Error::Api {
83 code: response.code,
84 message: response.msg,
85 }),
86 }
87 }
88
89 pub async fn login(&self, request: &LoginRequest<'_>) -> Result<LoginData, Error> {
90 let response: ApiResponse<LoginData> = self.post("/session/token", request).await?;
91 match response.data {
92 Some(data) => Ok(data),
93 None => Err(crate::Error::Api {
94 code: response.code,
95 message: response.msg,
96 }),
97 }
98 }
99
100 pub async fn finish_2fa_login(
101 &self,
102 request: &TwoFactorLoginRequest<'_>,
103 ) -> Result<Token, Error> {
104 let response: ApiResponse<Token> = self.post("/session/token/2fa", request).await?;
105 match response.data {
106 Some(token) => Ok(token),
107 None => Err(crate::Error::Api {
108 code: response.code,
109 message: response.msg,
110 }),
111 }
112 }
113
114 pub async fn refresh_token(&self, request: &RefreshTokenRequest<'_>) -> Result<Token, Error> {
115 let response: crate::ApiResponse<Token> =
116 self.post("/session/token/refresh", request).await?;
117 match response.data {
118 Some(token) => Ok(token),
119 None => Err(crate::Error::Api {
120 code: response.code,
121 message: response.msg,
122 }),
123 }
124 }
125
126 pub async fn logout(&self) -> Result<(), Error> {
127 let _: crate::ApiResponse<()> = self.delete("/session/token").await?;
128 Ok(())
129 }
130}