haste_repository/types/
user.rs

1use haste_fhir_model::r4::generated::terminology::UserRole as FHIRUserRole;
2use haste_jwt::TenantId;
3use serde::{Deserialize, Serialize};
4
5#[derive(sqlx::FromRow, Debug, Deserialize, Serialize)]
6pub struct User {
7    pub id: String,
8    pub tenant: TenantId,
9    pub email: Option<String>,
10    pub role: UserRole,
11    pub method: AuthMethod,
12    pub provider_id: Option<String>,
13}
14
15pub struct UpdateUser {
16    pub id: String,
17    pub email: Option<String>,
18    pub role: Option<UserRole>,
19    pub method: Option<AuthMethod>,
20    pub provider_id: Option<String>,
21    pub password: Option<String>,
22}
23
24pub enum LoginMethod {
25    OIDC { email: String, provider_id: String },
26    EmailPassword { email: String, password: String },
27}
28
29pub enum LoginResult {
30    Success { user: User },
31    Failure,
32}
33
34pub struct UserSearchClauses {
35    pub email: Option<String>,
36    pub role: Option<UserRole>,
37    pub method: Option<AuthMethod>,
38}
39
40pub struct CreateUser {
41    pub id: String,
42    pub email: Option<String>,
43    pub role: UserRole,
44    pub method: AuthMethod,
45    pub provider_id: Option<String>,
46    pub password: Option<String>,
47}
48
49#[derive(Clone, Debug, PartialEq, PartialOrd, sqlx::Type, serde::Deserialize, serde::Serialize)]
50#[sqlx(type_name = "auth_method", rename_all = "lowercase")] // only for PostgreSQL to match a type definition
51pub enum AuthMethod {
52    #[sqlx(rename = "email-password")]
53    EmailPassword,
54    #[sqlx(rename = "oidc-provider")]
55    OIDC,
56}
57
58#[derive(Clone, Debug, PartialEq, PartialOrd, sqlx::Type, serde::Deserialize, serde::Serialize)]
59#[sqlx(type_name = "user_role", rename_all = "lowercase")] // only for PostgreSQL to match a type definition
60#[serde(rename_all = "lowercase")]
61pub enum UserRole {
62    Owner,
63    Admin,
64    Member,
65}
66
67impl From<FHIRUserRole> for UserRole {
68    fn from(role: FHIRUserRole) -> Self {
69        match role {
70            FHIRUserRole::Owner(_) => UserRole::Owner,
71            FHIRUserRole::Admin(_) => UserRole::Admin,
72            FHIRUserRole::Member(_) => UserRole::Member,
73            FHIRUserRole::Null(_) => UserRole::Member,
74        }
75    }
76}