1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use utoipa::{IntoParams, ToSchema};
4use uuid::Uuid;
5
6use crate::MembershipRole;
7use crate::Pagination;
8
9#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
10pub struct AuthLoginRequest {
11 pub login_name: String,
12 pub password: String,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
16pub struct AuthUserResponse {
17 pub user_id: i64,
18 pub login_name: String,
19 pub display_name: String,
20 pub is_admin: bool,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub disabled_at: Option<DateTime<Utc>>,
23 pub personal_group_path: String,
24 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub personal_group_role: Option<MembershipRole>,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
29pub struct AuthMeResponse {
30 pub user: AuthUserResponse,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, ToSchema)]
34#[serde(rename_all = "snake_case")]
35pub enum PersonalAccessTokenScope {
36 Search,
37 Workspace,
38 Library,
39 Sources,
40 Settings,
41 Admin,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
45pub struct CreatePersonalAccessTokenRequest {
46 pub name: String,
47 pub scopes: Vec<PersonalAccessTokenScope>,
48 pub expires_in_days: u16,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
52pub struct PersonalAccessTokenResponse {
53 pub token_id: Uuid,
54 pub name: String,
55 pub display_prefix: String,
56 pub scopes: Vec<PersonalAccessTokenScope>,
57 pub expires_at: DateTime<Utc>,
58 #[serde(default, skip_serializing_if = "Option::is_none")]
59 pub last_used_at: Option<DateTime<Utc>>,
60 #[serde(default, skip_serializing_if = "Option::is_none")]
61 pub revoked_at: Option<DateTime<Utc>>,
62 pub created_at: DateTime<Utc>,
63 pub updated_at: DateTime<Utc>,
64}
65
66#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
67#[into_params(parameter_in = Query)]
68pub struct PersonalAccessTokenPageQuery {
69 #[serde(default = "default_page")]
70 pub page: u32,
71 #[serde(default = "default_page_size")]
72 pub page_size: u32,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
76pub struct PersonalAccessTokenPageResponse {
77 pub items: Vec<PersonalAccessTokenResponse>,
78 pub pagination: Pagination,
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
82pub struct CreatePersonalAccessTokenResponse {
83 pub access_token: String,
84 pub token: PersonalAccessTokenResponse,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
88pub struct AdminUserResponse {
89 pub user_id: i64,
90 pub login_name: String,
91 pub display_name: String,
92 pub is_admin: bool,
93 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub disabled_at: Option<DateTime<Utc>>,
95 pub created_at: DateTime<Utc>,
96 pub updated_at: DateTime<Utc>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
100pub struct AdminUserPageResponse {
101 pub items: Vec<AdminUserResponse>,
102 pub pagination: Pagination,
103}
104
105#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
106#[into_params(parameter_in = Query)]
107pub struct AdminUserPageQuery {
108 #[serde(default = "default_page")]
109 pub page: u32,
110 #[serde(default = "default_page_size")]
111 pub page_size: u32,
112 #[serde(default)]
113 pub query: Option<String>,
114}
115
116const fn default_page() -> u32 {
117 1
118}
119const fn default_page_size() -> u32 {
120 50
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
124pub struct CreateAdminUserRequest {
125 pub login_name: String,
126 pub display_name: String,
127 pub password: String,
128 pub is_admin: bool,
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
132pub struct UpdateAdminUserRequest {
133 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub display_name: Option<String>,
135 #[serde(default, skip_serializing_if = "Option::is_none")]
136 pub is_admin: Option<bool>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
140pub struct ResetAdminUserPasswordRequest {
141 pub password: String,
142}