use std::sync::Arc;
use auths_core::signing::{SecureSigner, StorageSigner};
use auths_core::storage::keychain::KeyAlias;
use auths_crypto::CurveType;
use auths_id::keri::Said;
use auths_id::keri::types::Prefix;
pub use auths_verifier::org_bundle::{
OffboardingRecord, SignedOffboardingRecord, find_revocation_event, verify_offboarding_record,
};
use crate::context::AuthsContext;
use crate::domains::org::error::OrgError;
fn curve_tag(curve: CurveType) -> &'static str {
match curve {
CurveType::Ed25519 => "ed25519",
CurveType::P256 => "p256",
}
}
pub fn sign_offboarding_record(
ctx: &AuthsContext,
org_alias: &KeyAlias,
org_curve: CurveType,
record: OffboardingRecord,
) -> Result<SignedOffboardingRecord, OrgError> {
let canonical = json_canon::to_string(&record)
.map_err(|e| OrgError::Signing(format!("canonicalize offboarding record: {e}")))?;
let signer = StorageSigner::new(Arc::clone(&ctx.key_storage));
let sig = signer
.sign_with_alias(
org_alias,
ctx.passphrase_provider.as_ref(),
canonical.as_bytes(),
)
.map_err(|e| OrgError::Signing(e.to_string()))?;
Ok(SignedOffboardingRecord {
record,
org_curve: curve_tag(org_curve).to_string(),
signature: hex::encode(sig),
})
}
pub fn store_offboarding_record(
ctx: &AuthsContext,
org_prefix: &Prefix,
member_prefix: &Prefix,
signed: &SignedOffboardingRecord,
) -> Result<(), OrgError> {
let bytes = serde_json::to_vec(signed)
.map_err(|e| OrgError::Signing(format!("serialize offboarding record: {e}")))?;
let key = Said::new_unchecked(member_prefix.as_str().to_string());
ctx.registry
.store_credential(org_prefix, &key, &bytes)
.map_err(OrgError::Storage)
}
pub fn load_offboarding_record(
ctx: &AuthsContext,
org_prefix: &Prefix,
member_prefix: &Prefix,
) -> Result<Option<SignedOffboardingRecord>, OrgError> {
let key = Said::new_unchecked(member_prefix.as_str().to_string());
let bytes = ctx
.registry
.load_credential(org_prefix, &key)
.map_err(OrgError::Storage)?;
match bytes {
Some(b) => {
let signed: SignedOffboardingRecord = serde_json::from_slice(&b)
.map_err(|e| OrgError::Signing(format!("deserialize offboarding record: {e}")))?;
Ok(Some(signed))
}
None => Ok(None),
}
}