use aws_config::SdkConfig;
use docbox_core::{
search::SearchIndexFactoryConfig,
secrets::{
SecretManager, SecretManagerError, SecretsManagerConfig,
aws::{AwsSecretManagerConfig, AwsSecretsManagerConfigError},
},
storage::StorageLayerFactoryConfig,
};
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Clone, Deserialize, Serialize)]
pub struct AdminDatabaseConfiguration {
pub host: String,
pub port: u16,
pub setup_user: Option<AdminDatabaseSetupUserConfig>,
pub setup_user_secret_name: Option<String>,
pub root_secret_name: Option<String>,
#[serde(default)]
pub root_iam: bool,
}
#[derive(Clone, Deserialize, Serialize)]
pub struct AdminDatabaseSetupUserConfig {
#[serde(alias = "user")]
pub username: String,
pub password: String,
}
#[derive(Clone, Deserialize, Serialize)]
pub struct ApiConfig {
pub url: String,
pub api_key: Option<String>,
}
#[derive(Clone, Deserialize, Serialize)]
pub struct ServerConfigData {
pub api: ApiConfig,
pub database: AdminDatabaseConfiguration,
pub secrets: SecretsManagerConfig,
pub search: SearchIndexFactoryConfig,
pub storage: StorageLayerFactoryConfig,
}
#[derive(Debug, Error)]
pub enum ServerConfigDataSecretError {
#[error("failed to load secret manager from env: {0}")]
SecretManager(AwsSecretsManagerConfigError),
#[error("failed to load secret: {0}")]
Secret(SecretManagerError),
#[error("secret not found")]
SecretNotFound,
}
pub async fn load_server_config_data_secret(
aws_config: &SdkConfig,
secret_name: &str,
) -> Result<ServerConfigData, ServerConfigDataSecretError> {
let secrets = SecretManager::from_config(
aws_config,
SecretsManagerConfig::Aws(
AwsSecretManagerConfig::from_env()
.map_err(ServerConfigDataSecretError::SecretManager)?,
),
);
secrets
.parsed_secret(secret_name)
.await
.map_err(ServerConfigDataSecretError::Secret)?
.ok_or(ServerConfigDataSecretError::SecretNotFound)
}