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    #[serde(default)]
167    pub webauthn_enabled: bool,
168    #[serde(default)]
169    pub sso_enabled: Option<bool>,
170    #[serde(default)]
171    pub password_enabled: bool,
172    #[serde(default)]
173    pub qq_enabled: Option<bool>,
174}
175
176/// OpenID preparation request
177#[derive(Debug, Serialize)]
178pub struct OpenIdPrepareRequest<'a> {
179    pub hint: Option<&'a str>,
180    pub linking: Option<bool>,
181    pub provider: i32,
182}
183
184/// OpenID finish request
185#[derive(Debug, Serialize)]
186pub struct OpenIdFinishRequest<'a> {
187    pub code: &'a str,
188    pub session_id: &'a str,
189    pub provider_id: i32,
190}
191
192/// Passkey sign-in preparation
193#[derive(Debug, Deserialize)]
194pub struct PasskeySignInPreparation {
195    pub session_id: String,
196    pub options: Value,
197}
198
199/// Passkey sign-in request
200#[derive(Debug, Serialize)]
201pub struct PasskeySignInRequest<'a> {
202    pub response: &'a str,
203    pub session_id: &'a str,
204}
205
206/// Complete login response
207#[derive(Debug, Deserialize)]
208pub struct LoginResponse {
209    pub user: NewUser,
210    pub token: Token,
211}
212
213/// Register request
214#[derive(Debug, Serialize)]
215pub struct RegisterRequest<'a> {
216    pub username: &'a str,
217    pub password: &'a str,
218    pub email: Option<&'a str>,
219}