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)]
79pub struct NewGroup {
80    pub id: String,
81    pub name: String,
82    pub permission: String,
83    pub direct_link_batch_size: i64,
84    pub trash_retention: i64,
85}
86
87/// User status enum
88#[derive(Debug, Serialize, Deserialize, Clone)]
89pub enum UserStatus {
90    #[serde(rename = "active")]
91    Active,
92    #[serde(rename = "inactive")]
93    Inactive,
94    #[serde(rename = "manual_banned")]
95    ManualBanned,
96    #[serde(rename = "sys_banned")]
97    SysBanned,
98}
99
100/// Avatar type enum
101#[derive(Debug, Serialize, Deserialize, Clone)]
102pub enum AvatarType {
103    #[serde(rename = "file")]
104    File,
105    #[serde(rename = "gravatar")]
106    Gravatar,
107}
108
109/// Share link visibility enum
110#[derive(Debug, Serialize, Deserialize, Clone)]
111pub enum ShareLinkVisibility {
112    #[serde(rename = "")]
113    Empty,
114    #[serde(rename = "all_share")]
115    AllShare,
116    #[serde(rename = "hide_share")]
117    HideShare,
118}
119
120/// Login request
121#[derive(Debug, Serialize)]
122pub struct LoginRequest<'a> {
123    pub email: &'a str,
124    pub password: &'a str,
125}
126
127/// Two-factor login request
128#[derive(Debug, Serialize)]
129pub struct TwoFactorLoginRequest<'a> {
130    pub email: &'a str,
131    pub password: &'a str,
132    pub code: &'a str,
133    pub ticket: Option<&'a str>,
134}
135
136/// Token refresh request
137#[derive(Debug, Serialize)]
138pub struct RefreshTokenRequest<'a> {
139    pub refresh_token: &'a str,
140}
141
142/// Two-factor setup response
143#[derive(Debug, Serialize, Deserialize)]
144pub struct TwoFactorSetup {
145    pub secret: String,
146    pub qr_code: String,
147    pub recovery_codes: Vec<String>,
148}
149
150/// Two-factor verification request
151#[derive(Debug, Serialize, Deserialize)]
152pub struct TwoFactorVerify {
153    pub code: String,
154}
155
156/// CAPTCHA response
157#[derive(Debug, Deserialize)]
158pub struct CaptchaResponse {
159    pub image: String,
160    pub ticket: String,
161}
162
163/// Login preparation data
164#[derive(Debug, Deserialize)]
165pub struct LoginPreparation {
166    pub webauthn_enabled: bool,
167    pub sso_enabled: bool,
168    pub password_enabled: bool,
169    pub qq_enabled: bool,
170}
171
172/// OpenID preparation request
173#[derive(Debug, Serialize)]
174pub struct OpenIdPrepareRequest<'a> {
175    pub hint: Option<&'a str>,
176    pub linking: Option<bool>,
177    pub provider: i32,
178}
179
180/// OpenID finish request
181#[derive(Debug, Serialize)]
182pub struct OpenIdFinishRequest<'a> {
183    pub code: &'a str,
184    pub session_id: &'a str,
185    pub provider_id: i32,
186}
187
188/// Passkey sign-in preparation
189#[derive(Debug, Deserialize)]
190pub struct PasskeySignInPreparation {
191    pub session_id: String,
192    pub options: Value,
193}
194
195/// Passkey sign-in request
196#[derive(Debug, Serialize)]
197pub struct PasskeySignInRequest<'a> {
198    pub response: &'a str,
199    pub session_id: &'a str,
200}
201
202/// Complete login response
203#[derive(Debug, Deserialize)]
204pub struct LoginResponse {
205    pub user: NewUser,
206    pub token: Token,
207}
208
209/// Register request
210#[derive(Debug, Serialize)]
211pub struct RegisterRequest<'a> {
212    pub username: &'a str,
213    pub password: &'a str,
214    pub email: Option<&'a str>,
215}