evento_sql_migrator/m0001/mod.rs
1//! Initial database schema migration.
2//!
3//! This module contains the first migration that creates the foundational database
4//! schema for Evento event sourcing.
5
6mod event;
7mod snapshot;
8mod subscriber;
9
10use sqlx_migrator::vec_box;
11
12/// Initial migration that creates the core database schema for Evento.
13///
14/// This migration creates the following database objects:
15///
16/// ## Event Table
17///
18/// The main table for storing domain events with the following columns:
19/// - `id` - Event identifier (ULID format, VARCHAR(26))
20/// - `name` - Event type name (VARCHAR(50))
21/// - `aggregator_type` - Aggregate root type (VARCHAR(50))
22/// - `aggregator_id` - Aggregate root instance ID (VARCHAR(26))
23/// - `version` - Event sequence number within the aggregate
24/// - `data` - Serialized event payload (BLOB)
25/// - `metadata` - Serialized event metadata (BLOB)
26/// - `routing_key` - Optional routing key for partitioning (VARCHAR(50))
27/// - `timestamp` - Event timestamp in seconds (BIGINT)
28///
29/// ## Event Indexes
30///
31/// Several indexes are created for efficient querying:
32/// - `idx_event_type` - Index on `aggregator_type`
33/// - `idx_event_type_id` - Composite index on `(aggregator_type, aggregator_id)`
34/// - `idx_event_routing_key_type` - Composite index on `(routing_key, aggregator_type)`
35/// - Unique constraint on `(aggregator_type, aggregator_id, version)`
36///
37/// ## Snapshot Table
38///
39/// Table for storing aggregate snapshots (note: dropped in [`M0003`](crate::M0003)):
40/// - `id` - Snapshot identifier
41/// - `type` - Snapshot type
42/// - `cursor` - Event stream cursor
43/// - `revision` - Revision identifier
44/// - `data` - Serialized snapshot data
45/// - Primary key: composite `(type, id)`
46///
47/// ## Subscriber Table
48///
49/// Table for tracking event subscription state:
50/// - `key` - Subscriber identifier (primary key)
51/// - `worker_id` - Associated worker ID
52/// - `cursor` - Current event stream position
53/// - `lag` - Subscription lag counter
54/// - `enabled` - Whether subscription is active
55/// - `created_at` / `updated_at` - Timestamps
56pub struct InitMigration;
57
58#[cfg(feature = "sqlite")]
59sqlx_migrator::sqlite_migration!(
60 InitMigration,
61 "main",
62 "init_migration",
63 vec_box![],
64 vec_box![
65 event::create_table::Operation,
66 event::create_type_idx::Operation,
67 event::create_type_id_idx::Operation,
68 event::create_routing_key_type_idx::Operation,
69 event::create_type_id_version_uk::Operation,
70 snapshot::create_table::Operation,
71 subscriber::create_table::Operation,
72 ]
73);
74
75#[cfg(feature = "mysql")]
76sqlx_migrator::mysql_migration!(
77 InitMigration,
78 "main",
79 "init_migration",
80 vec_box![],
81 vec_box![
82 event::create_table::Operation,
83 event::create_type_idx::Operation,
84 event::create_type_id_idx::Operation,
85 event::create_routing_key_type_idx::Operation,
86 event::create_type_id_version_uk::Operation,
87 snapshot::create_table::Operation,
88 subscriber::create_table::Operation,
89 ]
90);
91
92#[cfg(feature = "postgres")]
93sqlx_migrator::postgres_migration!(
94 InitMigration,
95 "main",
96 "init_migration",
97 vec_box![],
98 vec_box![
99 event::create_table::Operation,
100 event::create_type_idx::Operation,
101 event::create_type_id_idx::Operation,
102 event::create_routing_key_type_idx::Operation,
103 event::create_type_id_version_uk::Operation,
104 snapshot::create_table::Operation,
105 subscriber::create_table::Operation,
106 ]
107);