From de1879bbf257f933eb07cc3def447a7b9e146949 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 16 Apr 2026 09:52:31 +0800 Subject: [PATCH] refactor(events): add shared event envelopes with namespaces --- crates/plc_platform_core/src/event.rs | 17 +++++++++++++++++ crates/plc_platform_core/src/lib.rs | 3 +++ .../plc_platform_core/tests/event_namespace.rs | 16 ++++++++++++++++ src/event.rs | 6 ++++-- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 crates/plc_platform_core/src/event.rs create mode 100644 crates/plc_platform_core/tests/event_namespace.rs diff --git a/crates/plc_platform_core/src/event.rs b/crates/plc_platform_core/src/event.rs new file mode 100644 index 0000000..d218971 --- /dev/null +++ b/crates/plc_platform_core/src/event.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct EventEnvelope { + pub event_type: String, + pub payload: Value, +} + +impl EventEnvelope { + pub fn new(event_type: impl Into, payload: Value) -> Self { + Self { + event_type: event_type.into(), + payload, + } + } +} diff --git a/crates/plc_platform_core/src/lib.rs b/crates/plc_platform_core/src/lib.rs index b89faea..8a845fe 100644 --- a/crates/plc_platform_core/src/lib.rs +++ b/crates/plc_platform_core/src/lib.rs @@ -1,9 +1,12 @@ pub mod bootstrap; pub mod connection; pub mod db; +pub mod event; pub mod model; pub mod platform_context; pub mod service; pub mod telemetry; pub mod util; +pub use event::EventEnvelope; + diff --git a/crates/plc_platform_core/tests/event_namespace.rs b/crates/plc_platform_core/tests/event_namespace.rs new file mode 100644 index 0000000..93f35ac --- /dev/null +++ b/crates/plc_platform_core/tests/event_namespace.rs @@ -0,0 +1,16 @@ +use plc_platform_core::event::EventEnvelope; +use serde_json::json; + +#[test] +fn namespaced_event_types_keep_their_prefix() { + let envelope = EventEnvelope::new( + "feeder.auto_control_started", + json!({"unit_id": "00000000-0000-0000-0000-000000000000"}), + ); + + assert!(envelope.event_type.starts_with("feeder.")); + assert_eq!( + envelope.payload["unit_id"], + "00000000-0000-0000-0000-000000000000" + ); +} diff --git a/src/event.rs b/src/event.rs index 45358c3..23a4e4a 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use plc_platform_core::event::EventEnvelope; use tokio::sync::mpsc; use uuid::Uuid; use plc_platform_core::model::EventRecord; @@ -457,6 +458,7 @@ async fn persist_event_if_needed( let Some((event_type, level, unit_id, equipment_id, source_id, message, payload)) = record else { return; }; + let envelope = EventEnvelope::new(event_type, payload); let inserted = sqlx::query_as::<_, EventRecord>( r#" @@ -465,13 +467,13 @@ async fn persist_event_if_needed( RETURNING * "#, ) - .bind(event_type) + .bind(envelope.event_type) .bind(level) .bind(unit_id as Option) .bind(equipment_id as Option) .bind(source_id) .bind(message) - .bind(sqlx::types::Json(payload)) + .bind(sqlx::types::Json(envelope.payload)) .fetch_one(pool) .await;