Skip to main content

outbox_core/
model.rs

1use crate::object::{EventType, Payload, EventId};
2use time::OffsetDateTime;
3use uuid::Uuid;
4
5#[cfg_attr(feature = "sqlx", derive(sqlx::FromRow))]
6pub struct Event {
7    pub id: EventId,
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(event_type: EventType, payload: Payload) -> Self {
16        Self {
17            id: EventId::default(),
18            event_type,
19            payload,
20            created_at: OffsetDateTime::now_utc(),
21            locked_until: OffsetDateTime::UNIX_EPOCH,
22            status: EventStatus::Pending,
23        }
24    }
25    pub fn load(
26        id: Uuid,
27        event_type: &String,
28        payload: &serde_json::Value,
29        created_at: OffsetDateTime,
30        locked_until: OffsetDateTime,
31        status: &EventStatus
32    ) -> Self {
33        Self {
34            id: EventId::load(id),
35            event_type: EventType::load(event_type),
36            payload: Payload::load(payload),
37            created_at,
38            locked_until,
39            status: status.clone(),
40        }
41    }
42}
43
44#[cfg_attr(feature = "sqlx", derive(Debug, sqlx::Type))]
45#[cfg_attr(
46    feature = "sqlx",
47    sqlx(type_name = "status", rename_all = "PascalCase")
48)]
49#[derive(Clone)]
50pub enum EventStatus {
51    // Messages that need to be sent (including Pending and Failed)
52    Pending,
53    Processing,
54    Sent,
55}