use axum::http::HeaderMap;
use serde::Deserialize;
use super::super::auth::{ApiError, AppState};
mod materialized;
mod ndjson;
pub use materialized::query;
pub use ndjson::query_ndjson;
#[derive(Debug, Default, Deserialize)]
pub struct DatabaseQueryParam {
pub database: Option<String>,
}
pub(super) fn resolve_database_id(
headers: &HeaderMap,
param: &DatabaseQueryParam,
state: &AppState,
) -> Result<nodedb_types::DatabaseId, ApiError> {
let name = headers
.get("x-nodedb-database")
.and_then(|v| v.to_str().ok())
.filter(|s| !s.is_empty())
.map(|s| s.to_string())
.or_else(|| param.database.clone().filter(|s| !s.is_empty()));
let Some(db_name) = name else {
return Ok(nodedb_types::DatabaseId::DEFAULT);
};
let catalog = state.shared.credentials.catalog();
match catalog.get_database_id_by_name(&db_name) {
Ok(Some(id)) => Ok(id),
Ok(None) => Err(ApiError::BadRequest(format!(
"3D000 database '{db_name}' does not exist"
))),
Err(e) => Err(ApiError::Internal(format!("catalog lookup failed: {e}"))),
}
}