Skip to main content

reinhardt_core/signals/
db_events.rs

1//! Database lifecycle event helpers
2//!
3//! These helpers provide convenient database lifecycle events similar to SQLAlchemy,
4//! integrated with the Django-style signal system.
5
6use super::core::SignalName;
7use super::registry::get_signal;
8use super::signal::Signal;
9use serde::{Deserialize, Serialize};
10use std::collections::HashMap;
11
12/// Generic database event
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct DbEvent {
15	/// Type of database event (e.g., "insert", "update", "delete").
16	pub event_type: String,
17	/// Name of the database table affected.
18	pub table: String,
19	/// Optional primary key of the affected row.
20	pub id: Option<String>,
21	/// Additional key-value data associated with the event.
22	pub data: HashMap<String, String>,
23}
24
25impl DbEvent {
26	/// Creates a new database event with the given type and table name.
27	pub fn new(event_type: impl Into<String>, table: impl Into<String>) -> Self {
28		Self {
29			event_type: event_type.into(),
30			table: table.into(),
31			id: None,
32			data: HashMap::new(),
33		}
34	}
35
36	/// Sets the primary key of the affected row.
37	pub fn with_id(mut self, id: impl Into<String>) -> Self {
38		self.id = Some(id.into());
39		self
40	}
41
42	/// Adds a key-value data pair to the event.
43	pub fn with_data(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
44		self.data.insert(key.into(), value.into());
45		self
46	}
47}
48
49/// Before insert signal
50pub fn before_insert() -> Signal<DbEvent> {
51	get_signal::<DbEvent>(SignalName::DB_BEFORE_INSERT)
52}
53
54/// After insert signal
55pub fn after_insert() -> Signal<DbEvent> {
56	get_signal::<DbEvent>(SignalName::DB_AFTER_INSERT)
57}
58
59/// Before update signal
60pub fn before_update() -> Signal<DbEvent> {
61	get_signal::<DbEvent>(SignalName::DB_BEFORE_UPDATE)
62}
63
64/// After update signal
65pub fn after_update() -> Signal<DbEvent> {
66	get_signal::<DbEvent>(SignalName::DB_AFTER_UPDATE)
67}
68
69/// Before delete signal
70pub fn before_delete() -> Signal<DbEvent> {
71	get_signal::<DbEvent>(SignalName::DB_BEFORE_DELETE)
72}
73
74/// After delete signal
75pub fn after_delete() -> Signal<DbEvent> {
76	get_signal::<DbEvent>(SignalName::DB_AFTER_DELETE)
77}