docbox_management/root/
migrate_root.rs1use 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 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 if !check_database_table_exists(&root_db, "docbox_root_migrations")
46 .await
47 .map_err(MigrateRootError::CheckMigrationTable)?
48 {
49 initialize_root_migrations(&root_db)
51 .await
52 .map_err(MigrateRootError::CreateMigrationTable)?;
53 }
54
55 let mut root_t = root_db
57 .begin()
58 .await
59 .map_err(MigrateRootError::StartTransaction)?;
60
61 apply_root_migrations(&mut root_t, target_migration_name)
63 .await
64 .map_err(MigrateRootError::ApplyMigration)?;
65
66 root_t
68 .commit()
69 .await
70 .map_err(MigrateRootError::CommitTransaction)?;
71
72 Ok(())
73}