docbox_management/root/
migrate_root.rs

1use crate::database::{DatabaseProvider, close_pool_on_drop};
2use docbox_database::{
3    DbErr, ROOT_DATABASE_NAME,
4    create::check_database_table_exists,
5    migrations::{apply_root_migrations, initialize_root_migrations},
6};
7use thiserror::Error;
8
9#[derive(Debug, Error)]
10pub enum MigrateRootError {
11    #[error("error connecting to root database: {0}")]
12    ConnectRootDatabase(DbErr),
13
14    #[error("failed to check migrations table: {0}")]
15    CheckMigrationTable(DbErr),
16
17    #[error("failed to initialize migrations table: {0}")]
18    CreateMigrationTable(DbErr),
19
20    #[error("failed to apply migrations: {0}")]
21    ApplyMigration(DbErr),
22
23    #[error(transparent)]
24    StartTransaction(DbErr),
25
26    #[error(transparent)]
27    CommitTransaction(DbErr),
28}
29
30#[tracing::instrument(skip(db_provider))]
31pub async fn migrate_root(
32    db_provider: &impl DatabaseProvider,
33    target_migration_name: Option<&str>,
34) -> Result<(), MigrateRootError> {
35    // Connect to the root database
36    let root_db = db_provider
37        .connect(ROOT_DATABASE_NAME)
38        .await
39        .map_err(MigrateRootError::ConnectRootDatabase)?;
40
41    let _guard = close_pool_on_drop(&root_db);
42
43    // Check if the migrations table has been initialized
44    // (Table did not exist before v0.4.0)
45    if !check_database_table_exists(&root_db, "docbox_root_migrations")
46        .await
47        .map_err(MigrateRootError::CheckMigrationTable)?
48    {
49        // Initialize the migrations table
50        initialize_root_migrations(&root_db)
51            .await
52            .map_err(MigrateRootError::CreateMigrationTable)?;
53    }
54
55    // Start transactions
56    let mut root_t = root_db
57        .begin()
58        .await
59        .map_err(MigrateRootError::StartTransaction)?;
60
61    // Apply migrations
62    apply_root_migrations(&mut root_t, target_migration_name)
63        .await
64        .map_err(MigrateRootError::ApplyMigration)?;
65
66    // Commit database transaction
67    root_t
68        .commit()
69        .await
70        .map_err(MigrateRootError::CommitTransaction)?;
71
72    Ok(())
73}