haste_server/auth_n/session/
user.rs1use haste_fhir_model::r4::generated::terminology::IssueType;
2use haste_fhir_operation_error::OperationOutcomeError;
3use haste_jwt::TenantId;
4use haste_repository::types::user::User;
5use tower_sessions::Session;
6
7static USER_KEY: &str = "auth_user";
8
9fn user_key(tenant: &TenantId) -> String {
10 format!("{}_{}", tenant.as_ref(), USER_KEY)
11}
12
13pub async fn get_user(
14 session: &Session,
15 tenant: &TenantId,
16) -> Result<Option<User>, OperationOutcomeError> {
17 let user = session.get::<User>(&user_key(tenant)).await.map_err(|_e| {
18 OperationOutcomeError::fatal(
19 IssueType::Exception(None),
20 "Session returned an error when retrieving current user.".to_string(),
21 )
22 })?;
23
24 Ok(user)
25}
26
27pub async fn set_user(
28 session: &Session,
29 tenant: &TenantId,
30 user: &User,
31) -> Result<(), OperationOutcomeError> {
32 session.insert(&user_key(tenant), user).await.map_err(|_e| {
33 OperationOutcomeError::fatal(
34 IssueType::Exception(None),
35 "Failed to set user in session.".to_string(),
36 )
37 })
38}
39
40pub async fn clear_user(session: &Session, tenant: &TenantId) -> Result<(), OperationOutcomeError> {
41 session
42 .remove::<User>(&user_key(tenant))
43 .await
44 .map_err(|_e| {
45 OperationOutcomeError::fatal(
46 IssueType::Exception(None),
47 "Failed to clear user from session.".to_string(),
48 )
49 })?;
50
51 Ok(())
52}