Skip to main content

wfe_core/models/
event.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Event {
6    pub id: String,
7    pub event_name: String,
8    pub event_key: String,
9    pub event_data: serde_json::Value,
10    pub event_time: DateTime<Utc>,
11    pub is_processed: bool,
12}
13
14impl Event {
15    pub fn new(
16        event_name: impl Into<String>,
17        event_key: impl Into<String>,
18        event_data: serde_json::Value,
19    ) -> Self {
20        Self {
21            id: uuid::Uuid::new_v4().to_string(),
22            event_name: event_name.into(),
23            event_key: event_key.into(),
24            event_data,
25            event_time: Utc::now(),
26            is_processed: false,
27        }
28    }
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct EventSubscription {
33    pub id: String,
34    pub workflow_id: String,
35    pub step_id: usize,
36    pub execution_pointer_id: String,
37    pub event_name: String,
38    pub event_key: String,
39    pub subscribe_as_of: DateTime<Utc>,
40    pub subscription_data: Option<serde_json::Value>,
41    pub external_token: Option<String>,
42    pub external_worker_id: Option<String>,
43    pub external_token_expiry: Option<DateTime<Utc>>,
44}
45
46impl EventSubscription {
47    pub fn new(
48        workflow_id: impl Into<String>,
49        step_id: usize,
50        execution_pointer_id: impl Into<String>,
51        event_name: impl Into<String>,
52        event_key: impl Into<String>,
53        subscribe_as_of: DateTime<Utc>,
54    ) -> Self {
55        Self {
56            id: uuid::Uuid::new_v4().to_string(),
57            workflow_id: workflow_id.into(),
58            step_id,
59            execution_pointer_id: execution_pointer_id.into(),
60            event_name: event_name.into(),
61            event_key: event_key.into(),
62            subscribe_as_of,
63            subscription_data: None,
64            external_token: None,
65            external_worker_id: None,
66            external_token_expiry: None,
67        }
68    }
69}
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74    use pretty_assertions::assert_eq;
75
76    #[test]
77    fn new_event_defaults() {
78        let event = Event::new(
79            "order.created",
80            "order-456",
81            serde_json::json!({"amount": 100}),
82        );
83        assert_eq!(event.event_name, "order.created");
84        assert_eq!(event.event_key, "order-456");
85        assert!(!event.is_processed);
86    }
87
88    #[test]
89    fn new_event_generates_unique_ids() {
90        let e1 = Event::new("test", "key", serde_json::json!(null));
91        let e2 = Event::new("test", "key", serde_json::json!(null));
92        assert_ne!(e1.id, e2.id);
93    }
94
95    #[test]
96    fn event_serde_round_trip() {
97        let event = Event::new("test", "key", serde_json::json!({"data": true}));
98        let json = serde_json::to_string(&event).unwrap();
99        let deserialized: Event = serde_json::from_str(&json).unwrap();
100        assert_eq!(event.id, deserialized.id);
101        assert_eq!(event.event_name, deserialized.event_name);
102        assert_eq!(event.event_data, deserialized.event_data);
103    }
104
105    #[test]
106    fn new_subscription_defaults() {
107        let sub = EventSubscription::new("wf-1", 0, "ptr-1", "evt", "key", Utc::now());
108        assert_eq!(sub.workflow_id, "wf-1");
109        assert_eq!(sub.step_id, 0);
110        assert!(sub.external_token.is_none());
111        assert!(sub.subscription_data.is_none());
112    }
113
114    #[test]
115    fn subscription_serde_round_trip() {
116        let sub = EventSubscription::new("wf-1", 2, "ptr-1", "evt", "key", Utc::now());
117        let json = serde_json::to_string(&sub).unwrap();
118        let deserialized: EventSubscription = serde_json::from_str(&json).unwrap();
119        assert_eq!(sub.id, deserialized.id);
120        assert_eq!(sub.workflow_id, deserialized.workflow_id);
121        assert_eq!(sub.event_name, deserialized.event_name);
122    }
123}