diff options
| author | metamuffin <metamuffin@disroot.org> | 2023-08-02 15:08:43 +0200 | 
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2023-08-02 15:08:43 +0200 | 
| commit | c81d8bbfd46d53fba6e0086b5f859f8af8639f4a (patch) | |
| tree | 8088fcfad28e9fae3a0a70853b5fd12204cde35a /server/src/routes | |
| parent | 0d6a5fb84d3e0016c80baa1849612f550db31a81 (diff) | |
| download | jellything-c81d8bbfd46d53fba6e0086b5f859f8af8639f4a.tar jellything-c81d8bbfd46d53fba6e0086b5f859f8af8639f4a.tar.bz2 jellything-c81d8bbfd46d53fba6e0086b5f859f8af8639f4a.tar.zst | |
refactor admin panel
Diffstat (limited to 'server/src/routes')
| -rw-r--r-- | server/src/routes/mod.rs | 5 | ||||
| -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 | 
4 files changed, 46 insertions, 28 deletions
| diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs index 7f4789d..be4d2cb 100644 --- a/server/src/routes/mod.rs +++ b/server/src/routes/mod.rs @@ -18,8 +18,8 @@ use stream::r_stream;  use ui::{      account::{          admin::{ -            r_account_admin_dashboard, r_account_admin_invite, r_account_admin_remove_invite, -            r_account_admin_remove_user, +            r_account_admin_dashboard, r_account_admin_import, r_account_admin_invite, +            r_account_admin_remove_invite, r_account_admin_remove_user,          },          r_account_login, r_account_login_post, r_account_logout, r_account_logout_post,          r_account_register, r_account_register_post, @@ -92,6 +92,7 @@ pub fn build_rocket(remuxer: RemuxerContext, database: Database) -> Rocket<Build                  r_account_admin_invite,                  r_account_admin_remove_user,                  r_account_admin_remove_invite, +                r_account_admin_import,                  r_account_settings,                  r_account_settings_post,                  r_api_version, 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>>; | 
