Skip to main content

context69_contracts/
auth.rs

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 AuthTokenResponse {
29    pub access_token: String,
30    pub token_type: String,
31    pub expires_in_secs: u64,
32    pub user: AuthUserResponse,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
36pub struct AuthMeResponse {
37    pub user: AuthUserResponse,
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, ToSchema)]
41#[serde(rename_all = "snake_case")]
42pub enum PersonalAccessTokenScope {
43    Search,
44    Workspace,
45    Library,
46    Sources,
47    Settings,
48    Admin,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
52pub struct CreatePersonalAccessTokenRequest {
53    pub name: String,
54    pub scopes: Vec<PersonalAccessTokenScope>,
55    pub expires_in_days: u16,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
59pub struct PersonalAccessTokenResponse {
60    pub token_id: Uuid,
61    pub name: String,
62    pub display_prefix: String,
63    pub scopes: Vec<PersonalAccessTokenScope>,
64    pub expires_at: DateTime<Utc>,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub last_used_at: Option<DateTime<Utc>>,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub revoked_at: Option<DateTime<Utc>>,
69    pub created_at: DateTime<Utc>,
70    pub updated_at: DateTime<Utc>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
74pub struct CreatePersonalAccessTokenResponse {
75    pub access_token: String,
76    pub token: PersonalAccessTokenResponse,
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
80pub struct AdminUserResponse {
81    pub user_id: i64,
82    pub login_name: String,
83    pub display_name: String,
84    pub is_admin: bool,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub disabled_at: Option<DateTime<Utc>>,
87    pub created_at: DateTime<Utc>,
88    pub updated_at: DateTime<Utc>,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
92pub struct CreateAdminUserRequest {
93    pub login_name: String,
94    pub display_name: String,
95    pub password: String,
96    pub is_admin: bool,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
100pub struct UpdateAdminUserRequest {
101    #[serde(default, skip_serializing_if = "Option::is_none")]
102    pub display_name: Option<String>,
103    #[serde(default, skip_serializing_if = "Option::is_none")]
104    pub is_admin: Option<bool>,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
108pub struct ResetAdminUserPasswordRequest {
109    pub password: String,
110}