diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json index 76710b4..7c415d0 100644 --- a/crates/database/sqlx-data.json +++ b/crates/database/sqlx-data.json @@ -536,6 +536,16 @@ }, "query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?" }, + "657fdc2b228b14a6aba717e5083daf48204274ab62d73ec8968bcd0c7568b157": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Right": 0 + } + }, + "query": "vacuum" + }, "68cfa3d135eb4cdbdbcb3b943518b4ac09c371af689c444eb439a37f91ecf7a5": { "describe": { "columns": [], diff --git a/crates/database/src/tables/settings.rs b/crates/database/src/tables/settings.rs index 6c9c096..3ada076 100644 --- a/crates/database/src/tables/settings.rs +++ b/crates/database/src/tables/settings.rs @@ -38,6 +38,15 @@ impl Settings { .map_err(handle_error) } + pub async fn vacuum(conn: impl SqliteExecutor<'_>) -> Result<(), Error> { + sqlx::query!("vacuum") + .execute(conn) + .await + .map_err(handle_error)?; + + Ok(()) + } + pub async fn set_business_name( conn: impl SqliteExecutor<'_>, value: Option<&str>, diff --git a/crates/ezidam/src/routes/admin.rs b/crates/ezidam/src/routes/admin.rs index 2f05ff7..cd6590c 100644 --- a/crates/ezidam/src/routes/admin.rs +++ b/crates/ezidam/src/routes/admin.rs @@ -17,6 +17,7 @@ pub fn routes() -> Vec { settings_security, settings_security_form, settings_maintenance, + settings_maintenance_form, admin_apps_list, admin_apps_new, admin_apps_new_form, diff --git a/crates/ezidam/src/routes/admin/settings.rs b/crates/ezidam/src/routes/admin/settings.rs index 7129c4a..3d6be7c 100644 --- a/crates/ezidam/src/routes/admin/settings.rs +++ b/crates/ezidam/src/routes/admin/settings.rs @@ -209,3 +209,29 @@ pub async fn settings_maintenance( .map(|flash| Page::with_flash(page.clone(), flash)) .unwrap_or_else(|| page.into())) } + +#[derive(Debug, FromForm)] +pub struct CleanForm { + pub vacuum: Option, +} + +#[post("/admin/settings/maintenance", data = "
")] +pub async fn settings_maintenance_form( + mut db: Connection, + _admin: JwtAdmin, + form: Form, +) -> Result> { + let (flash_kind, flash_message) = if matches!(form.vacuum, Some(true)) { + Settings::vacuum(&mut **db).await?; + + (FlashKind::Success, "Database has been cleaned.") + } else { + (FlashKind::Warning, "Nothing to do.") + }; + + Ok(Flash::new( + Redirect::to(uri!(settings_maintenance)), + flash_kind, + flash_message, + )) +} diff --git a/crates/ezidam/templates/pages/admin/settings/maintenance.html.tera b/crates/ezidam/templates/pages/admin/settings/maintenance.html.tera index fe08c82..8e2427d 100644 --- a/crates/ezidam/templates/pages/admin/settings/maintenance.html.tera +++ b/crates/ezidam/templates/pages/admin/settings/maintenance.html.tera @@ -75,17 +75,7 @@

Do you want to clean the database?

-
- This action will delete the following: -
-
    -
  • Authorization codes
  • -
  • Refresh tokens
  • -
  • TOTP requests
  • -
-
- This action will be permanent. -
+
This might take some time, but should not be long.
@@ -99,7 +89,7 @@
- diff --git a/crates/settings/src/database.rs b/crates/settings/src/database.rs index 281e94e..33ba2ba 100644 --- a/crates/settings/src/database.rs +++ b/crates/settings/src/database.rs @@ -41,6 +41,10 @@ impl Settings { .map(human_bytes)) } + pub async fn vacuum(conn: impl SqliteExecutor<'_>) -> Result<(), Error> { + Ok(DatabaseSettings::vacuum(conn).await?) + } + pub async fn set_business_name( conn: impl SqliteExecutor<'_>, business_name: &str,