Skip to main content

context69_contracts/
auth.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use utoipa::{IntoParams, 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 AdminUserPageResponse {
85    pub items: Vec<AdminUserResponse>,
86    pub page: u32,
87    pub page_size: u32,
88    pub total: u64,
89    pub total_pages: u32,
90}
91
92#[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)]
93#[into_params(parameter_in = Query)]
94pub struct AdminUserPageQuery {
95    #[serde(default = "default_page")]
96    pub page: u32,
97    #[serde(default = "default_page_size")]
98    pub page_size: u32,
99    #[serde(default)]
100    pub query: Option<String>,
101}
102
103const fn default_page() -> u32 {
104    1
105}
106const fn default_page_size() -> u32 {
107    50
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
111pub struct CreateAdminUserRequest {
112    pub login_name: String,
113    pub display_name: String,
114    pub password: String,
115    pub is_admin: bool,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
119pub struct UpdateAdminUserRequest {
120    #[serde(default, skip_serializing_if = "Option::is_none")]
121    pub display_name: Option<String>,
122    #[serde(default, skip_serializing_if = "Option::is_none")]
123    pub is_admin: Option<bool>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
127pub struct ResetAdminUserPasswordRequest {
128    pub password: String,
129}