use crate::embedded::{SecretsCore, SecretsError};
use crate::spec_compat::{Scope, SecretUri};
use crate::{BrokerSecret, SecretMeta};
use greentic_types::TenantCtx;
use std::time::Duration;
pub type ProviderSecret = BrokerSecret;
pub fn events_provider_secret_uri(
tenant: &TenantCtx,
provider_name: &str,
) -> Result<SecretUri, SecretsError> {
let scope = scope_from_tenant(tenant)?;
let name = format!("{provider_name}__credentials");
SecretUri::new(scope, "events", name).map_err(SecretsError::from)
}
pub fn messaging_adapter_secret_uri(
tenant: &TenantCtx,
adapter_name: &str,
) -> Result<SecretUri, SecretsError> {
let scope = scope_from_tenant(tenant)?;
let name = format!("{adapter_name}__api-key");
SecretUri::new(scope, "messaging", name).map_err(SecretsError::from)
}
pub async fn get_events_provider_secret(
core: &SecretsCore,
tenant: &TenantCtx,
provider_name: &str,
) -> Result<ProviderSecret, SecretsError> {
let uri = events_provider_secret_uri(tenant, provider_name)?;
core.get_secret_with_meta(&uri.to_string()).await
}
pub async fn get_messaging_adapter_secret(
core: &SecretsCore,
tenant: &TenantCtx,
adapter_name: &str,
) -> Result<ProviderSecret, SecretsError> {
let uri = messaging_adapter_secret_uri(tenant, adapter_name)?;
core.get_secret_with_meta(&uri.to_string()).await
}
pub fn ttl_seconds(meta: &SecretMeta) -> Option<u64> {
meta.tags
.get("ttl_seconds")
.and_then(|value| value.parse::<u64>().ok())
}
pub fn ttl_duration(meta: &SecretMeta) -> Option<Duration> {
ttl_seconds(meta).map(Duration::from_secs)
}
fn scope_from_tenant(ctx: &TenantCtx) -> Result<Scope, SecretsError> {
let env = ctx.env.as_ref();
let tenant = ctx.tenant_id.as_ref();
let team = ctx
.team
.as_ref()
.or(ctx.team_id.as_ref())
.map(|team| team.as_ref().to_string());
Scope::new(env, tenant, team).map_err(SecretsError::from)
}