Skip to main content

outbox_core/
model.rs

1use crate::object::{EventId, EventType, IdempotencyToken, Payload};
2use time::OffsetDateTime;
3
4#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
5pub struct Event {
6    pub id: EventId,
7    pub idempotency_token: Option<IdempotencyToken>,
8    pub event_type: EventType,
9    pub payload: Payload,
10    pub created_at: OffsetDateTime,
11    pub locked_until: OffsetDateTime,
12    pub status: EventStatus,
13}
14impl Event {
15    pub fn new(
16        event_type: EventType,
17        payload: Payload,
18        idempotency_token: Option<IdempotencyToken>,
19    ) -> Self {
20        Self {
21            id: EventId::default(),
22            idempotency_token,
23            event_type,
24            payload,
25            created_at: OffsetDateTime::now_utc(),
26            locked_until: OffsetDateTime::UNIX_EPOCH,
27            status: EventStatus::Pending,
28        }
29    }
30}
31
32#[cfg_attr(feature = "sqlx", derive(Debug, sqlx::Type))]
33#[cfg_attr(
34    feature = "sqlx",
35    sqlx(type_name = "status", rename_all = "PascalCase")
36)]
37#[derive(Clone, PartialEq)]
38pub enum EventStatus {
39    // Messages that need to be sent (including Pending and Failed)
40    Pending,
41    Processing,
42    Sent,
43}