Skip to content
Clone
27fffe3
46 lines 1.3 KB Rust
use models::system::event_outbox;
use queue::{Envelope, Labels};
use sea_orm::{ActiveModelTrait, ConnectionTrait, DbErr, Set};
use serde::Serialize;
pub async fn enqueue<T: Serialize>(
db: &impl ConnectionTrait,
enabled: bool,
kind: &str,
labels: Labels,
payload: T,
ordering_key: impl Into<String>,
) -> Result<(), DbErr> {
if !enabled {
return Ok(());
}
let source = kind.split('.').next().unwrap_or_default().to_string();
let envelope = Envelope::new(kind, payload)
.with_source(source)
.with_labels(labels);
let subject = envelope
.subject()
.map_err(|error| DbErr::Custom(error.to_string()))?;
let stored = serde_json::to_value(&envelope)
.map_err(|error| DbErr::Custom(format!("encoding outbox event: {error}")))?;
event_outbox::ActiveModel {
id: Set(envelope.id),
subject: Set(subject),
kind: Set(kind.to_string()),
ordering_key: Set(ordering_key.into()),
envelope: Set(stored),
occurred_at: Set(envelope.occurred_at),
available_at: Set(envelope.occurred_at),
..Default::default()
}
.insert(db)
.await?;
Ok(())
}
pub fn request_id() -> Option<String> {
crate::middleware::request_id()
}