haste_server/auth_n/session/
user.rs

1use 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}