use affinidi_tdk::messaging::ATM;
use vti_common::vault::{SecretKind, StoredVaultEntry, put_stored_vault_entry};
use crate::error::AppError;
use crate::store::KeyspaceHandle;
pub const TTL_CEILING_SECS: u32 = 60;
pub struct ReleasedSecret {
pub jwe: String,
pub secret_kind: SecretKind,
pub ttl_seconds: u32,
}
pub async fn release_secret(
atm: &ATM,
vault_ks: &KeyspaceHandle,
vta_did: &str,
holder_did: &str,
mut stored: StoredVaultEntry,
ttl_hint: Option<u32>,
) -> Result<ReleasedSecret, AppError> {
let ttl_seconds = ttl_hint
.map(|t| t.min(TTL_CEILING_SECS))
.unwrap_or(TTL_CEILING_SECS);
let secret_body = serde_json::to_value(&stored.secret).map_err(|e| {
AppError::Internal(format!("vault/release: failed to serialise secret: {e}"))
})?;
let jwe = super::authcrypt_to_holder(
atm,
vta_did,
holder_did,
super::RELEASE_INNER_MSG_TYPE,
secret_body,
)
.await?;
let secret_kind = stored.entry.secret_kind;
stored.entry.last_used_at = Some(chrono::Utc::now().to_rfc3339());
if let Err(e) = put_stored_vault_entry(vault_ks, &stored).await {
tracing::warn!(
entry_id = %stored.entry.id,
error = %e,
"vault/release: lastUsedAt update failed; secret release proceeded"
);
}
Ok(ReleasedSecret {
jwe,
secret_kind,
ttl_seconds,
})
}