1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use utoipa::ToSchema;
4use uuid::Uuid;
5
6use crate::MembershipRole;
7
8#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
9pub struct AuthLoginRequest {
10 pub login_name: String,
11 pub password: String,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
15pub struct AuthUserResponse {
16 pub user_id: i64,
17 pub login_name: String,
18 pub display_name: String,
19 pub is_admin: bool,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub disabled_at: Option<DateTime<Utc>>,
22 pub personal_group_path: String,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub personal_group_role: Option<MembershipRole>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
28pub struct AuthMeResponse {
29 pub user: AuthUserResponse,
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, ToSchema)]
33#[serde(rename_all = "snake_case")]
34pub enum PersonalAccessTokenScope {
35 Search,
36 Workspace,
37 Library,
38 Sources,
39 Settings,
40 Admin,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
44pub struct CreatePersonalAccessTokenRequest {
45 pub name: String,
46 pub scopes: Vec<PersonalAccessTokenScope>,
47 pub expires_in_days: u16,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
51pub struct PersonalAccessTokenResponse {
52 pub token_id: Uuid,
53 pub name: String,
54 pub display_prefix: String,
55 pub scopes: Vec<PersonalAccessTokenScope>,
56 pub expires_at: DateTime<Utc>,
57 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub last_used_at: Option<DateTime<Utc>>,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
60 pub revoked_at: Option<DateTime<Utc>>,
61 pub created_at: DateTime<Utc>,
62 pub updated_at: DateTime<Utc>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
66pub struct CreatePersonalAccessTokenResponse {
67 pub access_token: String,
68 pub token: PersonalAccessTokenResponse,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
72pub struct AdminUserResponse {
73 pub user_id: i64,
74 pub login_name: String,
75 pub display_name: String,
76 pub is_admin: bool,
77 #[serde(default, skip_serializing_if = "Option::is_none")]
78 pub disabled_at: Option<DateTime<Utc>>,
79 pub created_at: DateTime<Utc>,
80 pub updated_at: DateTime<Utc>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
84pub struct CreateAdminUserRequest {
85 pub login_name: String,
86 pub display_name: String,
87 pub password: String,
88 pub is_admin: bool,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
92pub struct UpdateAdminUserRequest {
93 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub display_name: Option<String>,
95 #[serde(default, skip_serializing_if = "Option::is_none")]
96 pub is_admin: Option<bool>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
100pub struct ResetAdminUserPasswordRequest {
101 pub password: String,
102}