use dbnexus::db_entity;
use sea_orm::entity::prelude::*;
#[db_entity(table_name = "limiteron_event_outbox", primary_key = "id")]
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "limiteron_event_outbox")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i64,
#[sea_orm(column_type = "Text")]
pub event_type: String,
#[sea_orm(column_name = "aggregate_id")]
#[sea_orm(column_type = "Text")]
pub aggregate_id: String,
#[sea_orm(column_type = "Text")]
pub payload: String,
#[sea_orm(column_name = "delivery_status")]
pub status: String,
pub created_at: DateTimeUtc,
pub published_at: Option<DateTimeUtc>,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
pub fn create_table_ddl() -> &'static str {
r#"
CREATE TABLE IF NOT EXISTS limiteron_event_outbox (
id BIGSERIAL PRIMARY KEY,
event_type TEXT NOT NULL,
aggregate_id TEXT NOT NULL,
payload TEXT NOT NULL,
delivery_status VARCHAR(20) NOT NULL DEFAULT 'pending',
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
published_at TIMESTAMP WITH TIME ZONE
)
"#
}
pub fn create_table_ddl_sqlite() -> &'static str {
r#"
CREATE TABLE IF NOT EXISTS limiteron_event_outbox (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_type TEXT NOT NULL,
aggregate_id TEXT NOT NULL,
payload TEXT NOT NULL,
delivery_status TEXT NOT NULL DEFAULT 'pending',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
published_at TEXT
)
"#
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_outbox_ddl_contains_table() {
assert!(create_table_ddl().contains("limiteron_event_outbox"));
assert!(create_table_ddl_sqlite().contains("limiteron_event_outbox"));
assert!(create_table_ddl_sqlite().contains("delivery_status"));
}
}