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}