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;
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}