mod.rs 96 lignes · 3871 octets
//! Database migrations for Rustwarden.
//!
//! Single source of truth for all SeaORM migrations bundled with the
//! framework. Both the embedded auto-migrator (used by
//! `RustwardenApp::auto_migrate`) and the standalone
//! `migrate` binary read this list, so adding a migration in one place
//! is sufficient — there is no parallel list to keep in sync.
//!
//! # Adding a new migration
//!
//! 1. Create `mYYYYMMDD_NNNNNN_<name>.rs` in this directory.
//! 2. Add a `pub mod` declaration below.
//! 3. Append `Box::new(mYYYYMMDD_NNNNNN_<name>::Migration)` to
//!    `core_migrations()`.
//!
//! # Example: extending with application-specific migrations
//!
//! ```rust,ignore
//! use sea_orm_migration::prelude::*;
//! use rustwarden_core::migrations;
//!
//! struct AppMigrator;
//!
//! #[async_trait::async_trait]
//! impl MigratorTrait for AppMigrator {
//!     fn migrations() -> Vec<Box<dyn MigrationTrait>> {
//!         let mut all = migrations::core_migrations();
//!         all.push(Box::new(MyCustomMigration));
//!         all
//!     }
//! }
//! ```

/// Migration 1: initial schema (users, roles, refresh tokens, audit logs).
pub mod m20260305_000001_initial_schema;
/// Migration 2: application settings table.
pub mod m20260306_000002_create_app_settings_table;
/// Migration 3: RBAC permissions tables.
pub mod m20260309_000003_create_permissions_tables;
/// Migration 4: generic resources and resource-shares tables.
pub mod m20260309_000004_create_resources_tables;
/// Migration 5: OAuth accounts table.
pub mod m20260310_000005_create_oauth_accounts_table;
/// Migration 6: TOTP challenges and user-TOTP tables.
pub mod m20260409_000006_create_totp_tables;
/// Migration 7: personal access tokens table.
pub mod m20260422_000007_create_personal_access_tokens;
/// Migration 8: teams and team-members tables.
pub mod m20260423_000008_create_teams;
/// Migration 9: fediverse interop columns and `remote_identities` table.
pub mod m20260510_000009_fediverse_interop;
/// Migration 10: nullable `user_totp.last_used_step` anti-replay column (RFC 0037).
pub mod m20260918_000010_totp_last_used_step;
/// Migration 11: `pending_email_changes` table for two-step email change (RFC 0041).
pub mod m20260919_000011_pending_email_changes;

use sea_orm_migration::prelude::*;

/// Returns all core Rustwarden migrations in order.
pub fn core_migrations() -> Vec<Box<dyn MigrationTrait>> {
    vec![
        Box::new(m20260305_000001_initial_schema::Migration),
        Box::new(m20260306_000002_create_app_settings_table::Migration),
        Box::new(m20260309_000003_create_permissions_tables::Migration),
        Box::new(m20260309_000004_create_resources_tables::Migration),
        Box::new(m20260310_000005_create_oauth_accounts_table::Migration),
        Box::new(m20260409_000006_create_totp_tables::Migration),
        Box::new(m20260422_000007_create_personal_access_tokens::Migration),
        Box::new(m20260423_000008_create_teams::Migration),
        Box::new(m20260510_000009_fediverse_interop::Migration),
        Box::new(m20260918_000010_totp_last_used_step::Migration),
        Box::new(m20260919_000011_pending_email_changes::Migration),
    ]
}

/// SeaORM migrator running every core Rustwarden migration in order.
///
/// Used both by the embedded [`run_migrations`] helper and by the
/// standalone `migrate` binary. Implements [`MigratorTrait`] so it can
/// be passed to `cli::run_cli` for `up` / `down` / `refresh` / `status`
/// subcommands.
pub struct CoreMigrator;

#[async_trait::async_trait]
impl MigratorTrait for CoreMigrator {
    fn migrations() -> Vec<Box<dyn MigrationTrait>> {
        core_migrations()
    }
}

/// Run all pending core migrations on the database.
pub async fn run_migrations(
    db: &sea_orm::DatabaseConnection,
) -> Result<(), sea_orm_migration::DbErr> {
    CoreMigrator::up(db, None).await
}