use crate::proto::api::RotationRequest;
use crate::proto::audit::Actor;
use crate::proto::ids::{TokenId, VaultId};
use serde::{Deserialize, Serialize};
pub type CommitHook<'a> = &'a mut dyn FnMut(&JournalRecord) -> Result<(), String>;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct JournalRecord {
pub seq: u64,
pub ts: i64,
pub op: JournalOp,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)]
pub enum JournalOp {
RevokeTokens {
vault_id: VaultId,
token_ids: Vec<TokenId>,
actor: Actor,
reported: bool,
},
Rotate {
vault_id: VaultId,
actor: Actor,
request: RotationRequest,
},
DeleteVault {
vault_id: VaultId,
},
}
impl JournalRecord {
pub fn to_json(&self) -> Vec<u8> {
serde_json::to_vec(self).expect("a journal record always serializes")
}
pub fn from_json(bytes: &[u8]) -> Result<JournalRecord, serde_json::Error> {
serde_json::from_slice(bytes)
}
pub fn object_key(&self) -> String {
format!("journal/{:020}.json", self.seq)
}
}