diff options
Diffstat (limited to 'server/src/routes/ui')
-rw-r--r-- | server/src/routes/ui/account/admin.rs | 58 | ||||
-rw-r--r-- | server/src/routes/ui/error.rs | 2 | ||||
-rw-r--r-- | server/src/routes/ui/layout.rs | 9 |
3 files changed, 43 insertions, 26 deletions
diff --git a/server/src/routes/ui/account/admin.rs b/server/src/routes/ui/account/admin.rs index 37457b0..7124f4a 100644 --- a/server/src/routes/ui/account/admin.rs +++ b/server/src/routes/ui/account/admin.rs @@ -5,10 +5,11 @@ */ use crate::{ database::Database, + import::import, routes::ui::{ account::session::Session, error::MyResult, - layout::{DynLayoutPage, LayoutPage}, + layout::{DynLayoutPage, FlashDisplay, LayoutPage}, }, uri, }; @@ -24,16 +25,28 @@ pub fn r_account_admin_dashboard( if !session.user.admin { Err(anyhow!("you not admin"))? } + admin_dashboard(database, None) +} +pub fn admin_dashboard<'a>( + database: &Database, + flash: Option<MyResult<String>>, +) -> MyResult<DynLayoutPage<'a>> { // TODO this doesnt scale, pagination! let users = database.user.iter().collect::<Result<Vec<_>, _>>()?; let invites = database.invite.iter().collect::<Result<Vec<_>, _>>()?; + let flash = flash.map(|f| f.map_err(|e| format!("{e:?}"))); Ok(LayoutPage { title: "Admin Dashboard".to_string(), content: markup::new! { h1 { "Admin Panel" } - h2 { "Invitations"} + @FlashDisplay { flash: flash.clone() } + h2 { "Library" } + form[method="POST", action=uri!(r_account_admin_import())] { + input[type="submit", value="(Re-)Import Library"]; + } + h2 { "Invitations" } form[method="POST", action=uri!(r_account_admin_invite())] { input[type="submit", value="Generate new invite code"]; } @@ -71,13 +84,7 @@ pub fn r_account_admin_invite( let i = format!("{}", rand::thread_rng().gen::<u128>()); database.invite.insert(&i, &())?; - Ok(LayoutPage { - title: "Admin Dashboard".to_string(), - content: markup::new! { - pre { code { @i } } - }, - ..Default::default() - }) + admin_dashboard(database, Some(Ok(format!("Invite: {}", i)))) } #[derive(FromForm)] @@ -99,14 +106,7 @@ pub fn r_account_admin_remove_user( .remove(&form.name)? .ok_or(anyhow!("user did not exist"))?; - Ok(LayoutPage { - title: "User removed".to_string(), - content: markup::new! { - p { "User removed" } - a[href=uri!(r_account_admin_dashboard())] {"Back"} - }, - ..Default::default() - }) + admin_dashboard(database, Some(Ok("User removed".into()))) } #[derive(FromForm)] @@ -128,12 +128,20 @@ pub fn r_account_admin_remove_invite( .remove(&form.invite)? .ok_or(anyhow!("invite did not exist"))?; - Ok(LayoutPage { - title: "Invite invalidated".to_string(), - content: markup::new! { - p { "Invite invalidated" } - a[href=uri!(r_account_admin_dashboard())] {"Back"} - }, - ..Default::default() - }) + admin_dashboard(database, Some(Ok("Invite invalidated".into()))) +} + +#[post("/account/admin/import")] +pub async fn r_account_admin_import( + session: Session, + database: &State<Database>, +) -> MyResult<DynLayoutPage<'static>> { + if !session.user.admin { + Err(anyhow!("you not admin"))? + } + let r = import(&database).await; + admin_dashboard( + &database, + Some(r.map_err(|e| e.into()).map(|_| "Import successful".into())), + ) } diff --git a/server/src/routes/ui/error.rs b/server/src/routes/ui/error.rs index 01aebd3..190650f 100644 --- a/server/src/routes/ui/error.rs +++ b/server/src/routes/ui/error.rs @@ -90,4 +90,4 @@ impl From<serde_json::Error> for MyError { fn from(err: serde_json::Error) -> Self { MyError(anyhow::anyhow!("{err}")) } -}
\ No newline at end of file +} diff --git a/server/src/routes/ui/layout.rs b/server/src/routes/ui/layout.rs index 7844e22..7e51e5c 100644 --- a/server/src/routes/ui/layout.rs +++ b/server/src/routes/ui/layout.rs @@ -62,6 +62,15 @@ markup::define! { } } } + + FlashDisplay(flash: Option<Result<String, String>>) { + @if let Some(flash) = &flash { + @match flash { + Ok(mesg) => { section.message { p.success { @mesg } } } + Err(err) => { section.message { p.error { @format!("{err}") } } } + } + } + } } pub type DynLayoutPage<'a> = LayoutPage<markup::DynRender<'a>>; |