modo_db/lib.rs
1//! Database integration for the modo framework.
2//!
3//! Provides SeaORM-backed connection pooling, schema synchronisation, versioned
4//! migrations, pagination helpers, and a compile-time entity/migration
5//! registration system built on [`inventory`].
6//!
7//! # Features
8//!
9//! - `sqlite` *(default)* — enables SQLite support via `sqlx-sqlite`.
10//! - `postgres` — enables PostgreSQL support via `sqlx-postgres`.
11//!
12//! # Quick start
13//!
14//! ```rust,ignore
15//! #[modo_db::entity(table = "todos")]
16//! #[entity(timestamps)]
17//! pub struct Todo {
18//! #[entity(primary_key, auto = "ulid")]
19//! pub id: String,
20//! pub title: String,
21//! }
22//!
23//! // Entity in a named group (synced separately)
24//! #[modo_db::entity(table = "analytics", group = "analytics")]
25//! pub struct Event {
26//! #[entity(primary_key, auto = "ulid")]
27//! pub id: String,
28//! pub name: String,
29//! }
30//!
31//! #[modo::main]
32//! async fn main(
33//! app: modo::app::AppBuilder,
34//! config: Config,
35//! ) -> Result<(), Box<dyn std::error::Error>> {
36//! let db = modo_db::connect(&config.database).await?;
37//! modo_db::sync_and_migrate(&db).await?; // syncs all entities
38//! // modo_db::sync_and_migrate_group(&other_db, "analytics").await?; // syncs only "analytics" group
39//! app.config(config.core).managed_service(db).run().await
40//! }
41//! ```
42
43pub mod config;
44pub mod connect;
45pub mod entity;
46mod error;
47pub mod extractor;
48mod helpers;
49pub mod hooks;
50pub mod id;
51pub mod migration;
52pub mod pagination;
53pub mod pool;
54pub mod query;
55mod record;
56pub mod sync;
57
58// Public API
59pub use config::DatabaseConfig;
60pub use connect::connect;
61pub use entity::EntityRegistration;
62#[doc(hidden)]
63pub use error::db_err_to_error;
64pub use extractor::Db;
65#[doc(hidden)]
66pub use helpers::{do_delete, do_insert, do_update};
67pub use hooks::DefaultHooks;
68pub use id::{generate_short_id, generate_ulid};
69pub use migration::MigrationRegistration;
70pub use pagination::{
71 CursorParams, CursorResult, PageParams, PageResult, paginate, paginate_cursor,
72};
73pub use pool::DbPool;
74pub use query::{EntityDeleteMany, EntityQuery, EntityUpdateMany, JoinedManyQuery, JoinedQuery};
75pub use record::Record;
76pub use sync::{sync_and_migrate, sync_and_migrate_group};
77
78// Re-export proc macros
79pub use modo_db_macros::{entity, migration};
80
81// Re-exports for macro-generated code
82pub use chrono;
83pub use inventory;
84pub use sea_orm;
85
86/// Internal re-exports for generated code. Not public API.
87#[doc(hidden)]
88pub mod __internal {
89 // -- entity macro --
90 pub use crate::entity::EntityRegistration;
91 pub use crate::error::db_err_to_error;
92 pub use crate::helpers::{do_delete, do_insert, do_update};
93 pub use crate::hooks::DefaultHooks;
94 pub use crate::id::{generate_short_id, generate_ulid};
95 pub use crate::query::{EntityDeleteMany, EntityQuery, EntityUpdateMany};
96 pub use crate::record::Record;
97
98 // -- migration macro --
99 pub use crate::migration::MigrationRegistration;
100
101 // -- third-party re-exports --
102 pub use ::chrono;
103 pub use ::inventory;
104 pub use ::sea_orm;
105
106 // -- modo error types (used by entity macro for Result<_, modo::Error>) --
107 pub use ::modo;
108}