#![forbid(unsafe_code)]
use naaudit::{AuditEvent, AuditWriteError, TransactionalAuditSink};
use naoutbox_pgsql::PgOutbox;
#[derive(Debug, Clone)]
pub struct PgOutboxAuditSink {
outbox: PgOutbox,
}
impl Default for PgOutboxAuditSink {
fn default() -> Self {
Self::new()
}
}
impl PgOutboxAuditSink {
pub fn new() -> Self {
Self {
outbox: PgOutbox::new(),
}
}
pub fn with_datasource(
datasource: impl AsRef<str>,
) -> Result<Self, naoutbox_pgsql::OutboxStoreError> {
Ok(Self {
outbox: PgOutbox::with_datasource(datasource)?,
})
}
pub fn datasource_ref(&self) -> &natx_pgsql::DatasourceRef {
self.outbox.datasource_ref()
}
}
#[async_trait::async_trait]
impl TransactionalAuditSink for PgOutboxAuditSink {
async fn record_transactional(&self, event: AuditEvent) -> Result<(), AuditWriteError> {
self.outbox
.append_transactional(&event.into_outbox_event())
.await
.map_err(|_| AuditWriteError::new("transactional PostgreSQL outbox append failed"))
}
}