refactor(events): add shared event envelopes with namespaces

This commit is contained in:
caoqianming 2026-04-16 09:52:31 +08:00
parent 7d83cf27dd
commit de1879bbf2
4 changed files with 40 additions and 2 deletions

View File

@ -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<String>, payload: Value) -> Self {
Self {
event_type: event_type.into(),
payload,
}
}
}

View File

@ -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;

View File

@ -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"
);
}

View File

@ -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<Uuid>)
.bind(equipment_id as Option<Uuid>)
.bind(source_id)
.bind(message)
.bind(sqlx::types::Json(payload))
.bind(sqlx::types::Json(envelope.payload))
.fetch_one(pool)
.await;