aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/admin
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/admin')
-rw-r--r--server/src/routes/ui/admin/mod.rs31
1 files changed, 22 insertions, 9 deletions
diff --git a/server/src/routes/ui/admin/mod.rs b/server/src/routes/ui/admin/mod.rs
index 00a68ac..540ac72 100644
--- a/server/src/routes/ui/admin/mod.rs
+++ b/server/src/routes/ui/admin/mod.rs
@@ -31,7 +31,7 @@ use jellybase::{
federation::Federation,
CONF,
};
-use jellyimport::{import, is_importing};
+use jellyimport::{import, is_importing, IMPORT_ERRORS};
use markup::DynRender;
use rand::Rng;
use rocket::{form::Form, get, post, FromForm, State};
@@ -40,14 +40,14 @@ use tokio::sync::Semaphore;
use user::rocket_uri_macro_r_admin_users;
#[get("/admin/dashboard")]
-pub fn r_admin_dashboard(
+pub async fn r_admin_dashboard(
_session: AdminSession,
database: &State<DataAcid>,
) -> MyResult<DynLayoutPage<'static>> {
- admin_dashboard(database, None)
+ admin_dashboard(database, None).await
}
-pub fn admin_dashboard<'a>(
+pub async fn admin_dashboard<'a>(
database: &DataAcid,
flash: Option<MyResult<String>>,
) -> MyResult<DynLayoutPage<'a>> {
@@ -66,12 +66,22 @@ pub fn admin_dashboard<'a>(
};
let flash = flash.map(|f| f.map_err(|e| format!("{e:?}")));
+ let last_import_err = IMPORT_ERRORS.read().await.to_owned();
+
let database = database.to_owned();
Ok(LayoutPage {
title: "Admin Dashboard".to_string(),
content: markup::new! {
h1 { "Admin Panel" }
@FlashDisplay { flash: flash.clone() }
+ @if !last_import_err.is_empty() {
+ section.message.error {
+ p.error {"The last import resulted in at least one error:"}
+ ol { @for e in &last_import_err {
+ li.error { pre.error { @e } }
+ }}
+ }
+ }
ul {
li{a[href=uri!(r_admin_log(true))] { "Server Log (Warnings only)" }}
li{a[href=uri!(r_admin_log(false))] { "Server Log (Full) " }}
@@ -119,14 +129,14 @@ pub fn admin_dashboard<'a>(
}
#[post("/admin/generate_invite")]
-pub fn r_admin_invite(
+pub async fn r_admin_invite(
_session: AdminSession,
database: &State<DataAcid>,
) -> MyResult<DynLayoutPage<'static>> {
let i = format!("{}", rand::thread_rng().gen::<u128>());
T_INVITE.insert(&database, &*i, ())?;
- admin_dashboard(database, Some(Ok(format!("Invite: {}", i))))
+ admin_dashboard(database, Some(Ok(format!("Invite: {}", i)))).await
}
#[derive(FromForm)]
@@ -135,7 +145,7 @@ pub struct DeleteInvite {
}
#[post("/admin/remove_invite", data = "<form>")]
-pub fn r_admin_remove_invite(
+pub async fn r_admin_remove_invite(
session: AdminSession,
database: &State<DataAcid>,
form: Form<DeleteInvite>,
@@ -145,7 +155,7 @@ pub fn r_admin_remove_invite(
.remove(&database, form.invite.as_str())?
.ok_or(anyhow!("invite did not exist"))?;
- admin_dashboard(database, Some(Ok("Invite invalidated".into())))
+ admin_dashboard(database, Some(Ok("Invite invalidated".into()))).await
}
#[post("/admin/import")]
@@ -164,6 +174,7 @@ pub async fn r_admin_import(
.map(|_| format!("Import successful; took {:?}", t.elapsed())),
),
)
+ .await
}
#[post("/admin/delete_cache")]
@@ -182,6 +193,7 @@ pub async fn r_admin_delete_cache(
.map(|_| format!("Cache deleted; took {:?}", t.elapsed())),
),
)
+ .await
}
static SEM_TRANSCODING: Semaphore = Semaphore::const_new(1);
@@ -227,6 +239,7 @@ pub async fn r_admin_transcode_posters(
t.elapsed()
))),
)
+ .await
}
fn db_stats(db: &DataAcid) -> anyhow::Result<DynRender> {
@@ -244,7 +257,7 @@ fn db_stats(db: &DataAcid) -> anyhow::Result<DynRender> {
Ok(markup::new! {
h3 { "Key-Value-Store Statistics" }
- table {
+ table.border {
tbody {
tr {
th { "table name" }