use actix_web::{HttpRequest, HttpResponse};
use sqlx::postgres::PgPool;
use crate::AppState;
use crate::api::response::{bad_request, service_unavailable};
use crate::drivers::postgresql::sqlx_driver::RegisteredClient;
pub const ATHENA_CLIENT_HEADER: &str = "X-Athena-Client";
pub fn required_client_name(req: &HttpRequest) -> Result<String, HttpResponse> {
req.headers()
.get("x-athena-client")
.and_then(|value| value.to_str().ok())
.map(str::trim)
.filter(|value| !value.is_empty())
.map(ToString::to_string)
.ok_or_else(|| {
bad_request(
"Missing required header",
format!("{} header is required", ATHENA_CLIENT_HEADER),
)
})
}
pub fn pool_for_client(state: &AppState, client_name: &str) -> Result<PgPool, HttpResponse> {
state.pg_registry.get_pool(client_name).ok_or_else(|| {
bad_request(
format!("Client '{}' is not available in the registry", client_name),
"Postgres client not configured",
)
})
}
pub fn client_name_and_pool(
req: &HttpRequest,
state: &AppState,
) -> Result<(String, PgPool), HttpResponse> {
let name: String = required_client_name(req)?;
let pool: PgPool = pool_for_client(state, &name)?;
Ok((name, pool))
}
pub fn registered_client_for(
state: &AppState,
client_name: &str,
) -> Result<RegisteredClient, HttpResponse> {
state
.pg_registry
.registered_client(client_name)
.ok_or_else(|| {
bad_request(
"Unknown client",
format!("Client '{}' is not registered.", client_name),
)
})
}
pub fn logging_pool(state: &AppState) -> Result<PgPool, HttpResponse> {
let Some(client_name) = state.logging_client_name.as_ref() else {
return Err(service_unavailable(
"Logging store unavailable",
"No athena logging client is configured.",
));
};
state.pg_registry.get_pool(client_name).ok_or_else(|| {
service_unavailable(
"Logging store unavailable",
format!("Logging client '{}' is not connected.", client_name),
)
})
}
pub fn auth_pool(state: &AppState) -> Result<PgPool, HttpResponse> {
let Some(client_name) = state.gateway_auth_client_name.as_ref() else {
return Err(service_unavailable(
"Auth store unavailable",
"No gateway auth client is configured.",
));
};
state.pg_registry.get_pool(client_name).ok_or_else(|| {
service_unavailable(
"Auth store unavailable",
format!("Gateway auth client '{}' is not connected.", client_name),
)
})
}