From ff6c910b2ff18455d575f7e6c900bd114f55922e Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Sat, 6 May 2023 16:11:16 +0200 Subject: [PATCH] admin/settings: maintenance page, show database size --- Cargo.lock | 7 ++ .../queries/settings/database_size.sql | 2 + crates/database/sqlx-data.json | 18 +++ crates/database/src/tables/settings.rs | 7 ++ crates/ezidam/src/menu/items/admin.rs | 4 + crates/ezidam/src/page.rs | 5 + crates/ezidam/src/routes/admin.rs | 9 ++ crates/ezidam/src/routes/admin/settings.rs | 24 ++++ .../pages/admin/settings/branding.html.tera | 2 + .../admin/settings/maintenance.html.tera | 115 ++++++++++++++++++ .../pages/admin/settings/security.html.tera | 2 + crates/settings/Cargo.toml | 1 + crates/settings/src/database.rs | 7 ++ 13 files changed, 203 insertions(+) create mode 100644 crates/database/queries/settings/database_size.sql create mode 100644 crates/ezidam/templates/pages/admin/settings/maintenance.html.tera diff --git a/Cargo.lock b/Cargo.lock index edb36bb..4f2df05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1259,6 +1259,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +[[package]] +name = "human_bytes" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e2b089f28ad15597b48d8c0a8fe94eeb1c1cb26ca99b6f66ac9582ae10c5e6" + [[package]] name = "humansize" version = "2.1.3" @@ -2959,6 +2965,7 @@ version = "0.0.0" dependencies = [ "chrono", "database", + "human_bytes", "id", "thiserror", "url", diff --git a/crates/database/queries/settings/database_size.sql b/crates/database/queries/settings/database_size.sql new file mode 100644 index 0000000..4043fc3 --- /dev/null +++ b/crates/database/queries/settings/database_size.sql @@ -0,0 +1,2 @@ +select page_count * page_size +FROM pragma_page_count(), pragma_page_size(); \ No newline at end of file diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json index d93011c..76710b4 100644 --- a/crates/database/sqlx-data.json +++ b/crates/database/sqlx-data.json @@ -1598,6 +1598,24 @@ }, "query": "select id,\n created_at as \"created_at: DateTime\",\n updated_at as \"updated_at: DateTime\",\n label,\n redirect_uri,\n secret,\n is_confidential as \"is_confidential: bool\",\n is_archived as \"is_archived: bool\"\nfrom apps\n\nwhere id is (?)\n" }, + "e977ca16c7bd7ec4125725ff5e42d3c547634e2b608d6be91814bce657e07b65": { + "describe": { + "columns": [ + { + "name": "page_count * page_size", + "ordinal": 0, + "type_info": "Int" + } + ], + "nullable": [ + null + ], + "parameters": { + "Right": 0 + } + }, + "query": "select page_count * page_size\nFROM pragma_page_count(), pragma_page_size();" + }, "eaf0744f65a1de803fa8cc21b67bad4bdf22760d431265cf97b911e6456b2fd8": { "describe": { "columns": [ diff --git a/crates/database/src/tables/settings.rs b/crates/database/src/tables/settings.rs index 00d84a8..6c9c096 100644 --- a/crates/database/src/tables/settings.rs +++ b/crates/database/src/tables/settings.rs @@ -31,6 +31,13 @@ impl Settings { .map_err(handle_error) } + pub async fn database_size(conn: impl SqliteExecutor<'_>) -> Result, Error> { + sqlx::query_file_scalar!("queries/settings/database_size.sql") + .fetch_one(conn) + .await + .map_err(handle_error) + } + pub async fn set_business_name( conn: impl SqliteExecutor<'_>, value: Option<&str>, diff --git a/crates/ezidam/src/menu/items/admin.rs b/crates/ezidam/src/menu/items/admin.rs index d22c074..dc5f18f 100644 --- a/crates/ezidam/src/menu/items/admin.rs +++ b/crates/ezidam/src/menu/items/admin.rs @@ -65,6 +65,10 @@ impl AdminMenu { label: "Security", link: uri!(routes::admin::settings::settings_security).to_string(), }, + SubItem { + label: "Maintenance", + link: uri!(routes::admin::settings::settings_maintenance).to_string(), + }, ]), }, ] diff --git a/crates/ezidam/src/page.rs b/crates/ezidam/src/page.rs index ad73035..0556071 100644 --- a/crates/ezidam/src/page.rs +++ b/crates/ezidam/src/page.rs @@ -18,6 +18,7 @@ pub enum Page { AdminDashboard(AdminDashboard), AdminSettingsBranding(AdminSettingsBranding), AdminSettingsSecurity(AdminSettingsSecurity), + AdminSettingsMaintenance(AdminSettingsMaintenance), AdminAppsList(AdminAppsList), AdminAppsNew(AdminAppsNew), AdminAppsView(AdminAppsView), @@ -45,6 +46,7 @@ impl Page { Page::AdminDashboard(_) => "pages/admin/dashboard", Page::AdminSettingsBranding(_) => "pages/admin/settings/branding", Page::AdminSettingsSecurity(_) => "pages/admin/settings/security", + Page::AdminSettingsMaintenance(_) => "pages/admin/settings/maintenance", Page::AdminAppsList(_) => "pages/admin/apps/list", Page::AdminAppsNew(_) => "pages/admin/apps/new", Page::AdminAppsView(_) => "pages/admin/apps/view", @@ -72,6 +74,7 @@ impl Page { Page::AdminDashboard(_) => "Admin dashboard", Page::AdminSettingsBranding(_) => "Server branding", Page::AdminSettingsSecurity(_) => "Server security", + Page::AdminSettingsMaintenance(_) => "Server maintenance", Page::AdminAppsList(_) => "Applications", Page::AdminAppsNew(_) => "New application", Page::AdminAppsView(_) => "Application info", @@ -101,6 +104,7 @@ impl Page { Page::AdminDashboard(_) => Some(AdminMenu::Dashboard.into()), Page::AdminSettingsBranding(_) => Some(AdminMenu::Settings.into()), Page::AdminSettingsSecurity(_) => Some(AdminMenu::Settings.into()), + Page::AdminSettingsMaintenance(_) => Some(AdminMenu::Settings.into()), Page::AdminAppsList(_) => Some(AdminMenu::Apps.into()), Page::AdminAppsNew(_) => Some(AdminMenu::Apps.into()), Page::AdminAppsView(_) => Some(AdminMenu::Apps.into()), @@ -128,6 +132,7 @@ impl Page { Page::AdminDashboard(dashboard) => Box::new(dashboard), Page::AdminSettingsBranding(branding) => Box::new(branding), Page::AdminSettingsSecurity(security) => Box::new(security), + Page::AdminSettingsMaintenance(maintenance) => Box::new(maintenance), Page::AdminAppsList(list) => Box::new(list), Page::AdminAppsNew(new) => Box::new(new), Page::AdminAppsView(view) => Box::new(view), diff --git a/crates/ezidam/src/routes/admin.rs b/crates/ezidam/src/routes/admin.rs index 5736756..2f05ff7 100644 --- a/crates/ezidam/src/routes/admin.rs +++ b/crates/ezidam/src/routes/admin.rs @@ -16,6 +16,7 @@ pub fn routes() -> Vec { settings_update_branding, settings_security, settings_security_form, + settings_maintenance, admin_apps_list, admin_apps_new, admin_apps_new_form, @@ -65,6 +66,14 @@ pub mod content { pub user: JwtClaims, } + #[derive(Serialize)] + #[serde(crate = "rocket::serde")] + #[derive(Clone)] + pub struct AdminSettingsMaintenance { + pub user: JwtClaims, + pub database_size: String, + } + #[derive(Serialize)] #[serde(crate = "rocket::serde")] #[derive(Clone)] diff --git a/crates/ezidam/src/routes/admin/settings.rs b/crates/ezidam/src/routes/admin/settings.rs index 75cb4c5..7129c4a 100644 --- a/crates/ezidam/src/routes/admin/settings.rs +++ b/crates/ezidam/src/routes/admin/settings.rs @@ -185,3 +185,27 @@ pub async fn settings_security_form( flash_message, )) } + +#[get("/admin/settings/maintenance")] +pub async fn settings_maintenance( + mut db: Connection, + admin: JwtAdmin, + flash: Option>, +) -> Result