Skip to main content

haste_server/auth_n/oidc/hardcoded_clients/
admin_app.rs

1use crate::config::ServerConfig;
2use haste_fhir_model::r4::generated::{
3    resources::ClientApplication,
4    terminology::{ClientapplicationGrantType, ClientapplicationResponseTypes},
5    types::FHIRString,
6};
7use haste_jwt::{ProjectId, TenantId};
8
9pub fn get_admin_app(config: &ServerConfig) -> Option<ClientApplication> {
10    let redirect_uri = &config.admin_app_redirect_uri;
11
12    Some(ClientApplication {
13        id: Some("admin-app".to_string()),
14        name: Box::new(FHIRString {
15            value: Some("Admin Application".to_string()),
16            ..Default::default()
17        }),
18        responseTypes: ClientapplicationResponseTypes::code(),
19        scope: Some(Box::new(FHIRString {
20            value: Some("offline_access openid email profile fhirUser system/*.*".to_string()),
21            ..Default::default()
22        })),
23        grantType: vec![
24            ClientapplicationGrantType::authorization_code(),
25            ClientapplicationGrantType::refresh_token(),
26        ],
27        redirectUri: Some(vec![FHIRString {
28            value: Some(redirect_uri.clone()),
29            ..Default::default()
30        }]),
31        ..Default::default()
32    })
33}
34
35// Return the Admin app redirect url for the current tenant.
36pub fn redirect_url(
37    config: &ServerConfig,
38    tenant_id: &TenantId,
39    project_id: &ProjectId,
40) -> Option<String> {
41    let admin_app = get_admin_app(config);
42
43    if let Some(app) = admin_app {
44        app.redirectUri
45            .as_ref()
46            .and_then(|uris| uris.first())
47            .and_then(|uri| uri.value.as_ref())
48            .map(|uri| {
49                uri.replace(
50                    "*",
51                    &(tenant_id.as_ref().to_string() + "_" + project_id.as_ref()),
52                )
53            })
54    } else {
55        None
56    }
57}