Skip to main content

cloudreve_api/api/v4/models/
auth.rs

1//! Authentication and user-related models for Cloudreve API v4
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6/// User information
7#[derive(Debug, Serialize, Deserialize, Clone)]
8pub struct User {
9    pub id: String,
10    pub email: String,
11    pub nickname: String,
12    #[serde(default)]
13    pub status: Option<String>,
14    #[serde(default)]
15    pub avatar: Option<String>,
16    pub created_at: String,
17    #[serde(default)]
18    pub group: Option<UserGroup>,
19}
20
21/// User group information
22#[derive(Debug, Serialize, Deserialize, Clone)]
23pub struct UserGroup {
24    pub id: String,
25    pub name: String,
26    #[serde(default)]
27    pub permission: Option<String>,
28    #[serde(default)]
29    pub direct_link_batch_size: Option<u64>,
30    #[serde(default)]
31    pub trash_retention: Option<u64>,
32}
33
34/// JWT token information
35#[derive(Debug, Serialize, Deserialize, Clone)]
36pub struct Token {
37    pub access_token: String,
38    pub refresh_token: String,
39    pub access_expires: String,
40    pub refresh_expires: String,
41}
42
43/// Login response containing user and token
44#[derive(Debug, Serialize, Deserialize)]
45pub struct LoginData {
46    pub user: User,
47    pub token: Token,
48}
49
50/// Extended user information
51#[derive(Debug, Serialize, Deserialize, Clone)]
52pub struct NewUser {
53    pub id: String,
54    pub email: Option<String>,
55    pub nickname: Option<String>,
56    pub created_at: String,
57    #[serde(default)]
58    pub anonymous: Option<bool>,
59    #[serde(default)]
60    pub group: Option<NewGroup>,
61    #[serde(default)]
62    pub status: Option<UserStatus>,
63    #[serde(default)]
64    pub avatar: Option<AvatarType>,
65    #[serde(default)]
66    pub preferred_theme: Option<String>,
67    #[serde(default)]
68    pub credit: Option<i64>,
69    #[serde(default)]
70    pub language: Option<String>,
71    #[serde(default)]
72    pub disable_view_sync: Option<String>,
73    #[serde(default)]
74    pub share_links_in_profile: Option<ShareLinkVisibility>,
75}
76
77/// Extended group information
78#[derive(Debug, Serialize, Deserialize, Clone, Default)]
79#[serde(default)]
80pub struct NewGroup {
81    #[serde(default)]
82    pub id: String,
83    #[serde(default)]
84    pub name: String,
85    #[serde(default)]
86    pub permission: String,
87    #[serde(default)]
88    pub direct_link_batch_size: Option<i64>,
89    #[serde(default)]
90    pub trash_retention: Option<i64>,
91}
92
93/// User status enum
94#[derive(Debug, Serialize, Deserialize, Clone)]
95pub enum UserStatus {
96    #[serde(rename = "active")]
97    Active,
98    #[serde(rename = "inactive")]
99    Inactive,
100    #[serde(rename = "manual_banned")]
101    ManualBanned,
102    #[serde(rename = "sys_banned")]
103    SysBanned,
104}
105
106/// Avatar type enum
107#[derive(Debug, Serialize, Deserialize, Clone)]
108pub enum AvatarType {
109    #[serde(rename = "file")]
110    File,
111    #[serde(rename = "gravatar")]
112    Gravatar,
113}
114
115/// Share link visibility enum
116#[derive(Debug, Serialize, Deserialize, Clone)]
117pub enum ShareLinkVisibility {
118    #[serde(rename = "")]
119    Empty,
120    #[serde(rename = "all_share")]
121    AllShare,
122    #[serde(rename = "hide_share")]
123    HideShare,
124}
125
126/// Login request
127#[derive(Debug, Serialize)]
128pub struct LoginRequest<'a> {
129    pub email: &'a str,
130    pub password: &'a str,
131    /// CAPTCHA code (required if captcha is enabled on server)
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub captcha: Option<&'a str>,
134    /// CAPTCHA ticket from /site/captcha endpoint
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub ticket: Option<&'a str>,
137}
138
139/// Two-factor login request
140#[derive(Debug, Serialize)]
141pub struct TwoFactorLoginRequest<'a> {
142    /// One time passcode
143    pub otp: &'a str,
144    /// 2FA session ID from initial login response
145    pub session_id: &'a str,
146}
147
148/// Token refresh request
149#[derive(Debug, Serialize)]
150pub struct RefreshTokenRequest<'a> {
151    pub refresh_token: &'a str,
152}
153
154/// Two-factor setup response
155#[derive(Debug, Serialize, Deserialize)]
156pub struct TwoFactorSetup {
157    pub secret: String,
158    pub qr_code: String,
159    pub recovery_codes: Vec<String>,
160}
161
162/// Two-factor verification request
163#[derive(Debug, Serialize, Deserialize)]
164pub struct TwoFactorVerify {
165    pub code: String,
166}
167
168/// CAPTCHA response
169#[derive(Debug, Deserialize)]
170pub struct CaptchaResponse {
171    pub image: String,
172    pub ticket: String,
173}
174
175/// Login preparation data
176#[derive(Debug, Deserialize)]
177pub struct LoginPreparation {
178    #[serde(default)]
179    pub webauthn_enabled: bool,
180    #[serde(default)]
181    pub sso_enabled: Option<bool>,
182    #[serde(default)]
183    pub password_enabled: bool,
184    #[serde(default)]
185    pub qq_enabled: Option<bool>,
186}
187
188/// OpenID preparation request
189#[derive(Debug, Serialize)]
190pub struct OpenIdPrepareRequest<'a> {
191    pub hint: Option<&'a str>,
192    pub linking: Option<bool>,
193    pub provider: i32,
194}
195
196/// OpenID finish request
197#[derive(Debug, Serialize)]
198pub struct OpenIdFinishRequest<'a> {
199    pub code: &'a str,
200    pub session_id: &'a str,
201    pub provider_id: i32,
202}
203
204/// Passkey sign-in preparation
205#[derive(Debug, Deserialize)]
206pub struct PasskeySignInPreparation {
207    pub session_id: String,
208    pub options: Value,
209}
210
211/// Passkey sign-in request
212#[derive(Debug, Serialize)]
213pub struct PasskeySignInRequest<'a> {
214    pub response: &'a str,
215    pub session_id: &'a str,
216}
217
218/// Complete login response
219#[derive(Debug, Deserialize)]
220pub struct LoginResponse {
221    pub user: NewUser,
222    pub token: Token,
223}
224
225/// Register request
226#[derive(Debug, Serialize)]
227pub struct RegisterRequest<'a> {
228    pub username: &'a str,
229    pub password: &'a str,
230    pub email: Option<&'a str>,
231}