use wyrd_spec::DataTenantId;
use wyrd_spec::vala::api::AuditEvent;
use wyrd_spec::{
actor::Actor, redaction::RedactionPolicy, request_id::RequestId, trace::TraceContext,
};
use crate::outbox::{Outbox, OutboxSink};
pub trait AuditStage: Send + Sync {
fn stage(&self, tenant: DataTenantId, event: AuditEvent);
}
impl<S> AuditStage for Outbox<S>
where
S: OutboxSink,
S::Item: From<AuditEvent>,
{
fn stage(&self, tenant: DataTenantId, event: AuditEvent) {
Self::stage(self, tenant, event);
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AuditEnvelopeSeed {
pub operation: String,
pub subject: Option<String>,
pub request_id: RequestId,
pub trace_context: Option<TraceContext>,
pub actor: Actor,
pub redaction_policy: RedactionPolicy,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AuditEnvelopeDraft {
pub operation: String,
pub subject: Option<String>,
pub request_id: RequestId,
pub trace_context: Option<TraceContext>,
pub actor: Actor,
pub redaction_policy: RedactionPolicy,
}
#[must_use]
pub fn prepare(seed: AuditEnvelopeSeed) -> AuditEnvelopeDraft {
AuditEnvelopeDraft {
operation: seed.operation,
subject: seed.subject,
request_id: seed.request_id,
trace_context: seed.trace_context,
actor: seed.actor,
redaction_policy: seed.redaction_policy,
}
}