diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-22 14:56:46 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-22 14:56:46 +0100 |
commit | a8402e7f17e978b839a605d4715ca51b4a76f1f3 (patch) | |
tree | ce411485725efc6d224a9dce917175af26934126 /server/src/routes/ui/account | |
parent | ed870d1fc04891e79ab1d40be473a07810a62e69 (diff) | |
download | jellything-a8402e7f17e978b839a605d4715ca51b4a76f1f3.tar jellything-a8402e7f17e978b839a605d4715ca51b4a76f1f3.tar.bz2 jellything-a8402e7f17e978b839a605d4715ca51b4a76f1f3.tar.zst |
admin panel
Diffstat (limited to 'server/src/routes/ui/account')
-rw-r--r-- | server/src/routes/ui/account/admin.rs | 91 | ||||
-rw-r--r-- | server/src/routes/ui/account/mod.rs | 5 |
2 files changed, 94 insertions, 2 deletions
diff --git a/server/src/routes/ui/account/admin.rs b/server/src/routes/ui/account/admin.rs new file mode 100644 index 0000000..1fbd7dd --- /dev/null +++ b/server/src/routes/ui/account/admin.rs @@ -0,0 +1,91 @@ +use crate::{ + database::Database, + routes::ui::{ + account::session::Session, + error::MyResult, + layout::{DynLayoutPage, LayoutPage}, + }, + uri, +}; +use anyhow::anyhow; +use rand::Rng; +use rocket::{form::Form, get, post, FromForm, State}; + +#[get("/account/admin/dashboard")] +pub fn r_account_admin_dashboard( + session: Session, + database: &State<Database>, +) -> MyResult<DynLayoutPage<'static>> { + if !session.user.admin { + Err(anyhow!("you not admin"))? + } + + // TODO this doesnt scale + let users = database.users.iter().collect::<Result<Vec<_>, _>>()?; + + Ok(LayoutPage { + title: "Admin Dashboard".to_string(), + content: markup::new! { + h1 { "Admin Panel" } + h2 { "Invitations"} + form[method="POST", action=uri!(r_account_admin_invite())] { + input[type="submit", value="Generate new invite code"]; + } + h2 { "Users" } + @for (_, u) in &users { + form[method="POST", action=uri!(r_account_admin_remove_user())] { + span { @format!("{:?}", u.display_name) " (" @u.name ")" } + input[type="text", name="name", value=&u.name, hidden]; + input[type="submit", value="Remove(!)"]; + } + } + }, + }) +} + +#[post("/account/admin/generate_invite")] +pub fn r_account_admin_invite( + session: Session, + database: &State<Database>, +) -> MyResult<DynLayoutPage<'static>> { + if !session.user.admin { + Err(anyhow!("you not admin"))? + } + + let i = format!("{}", rand::thread_rng().gen::<u128>()); + database.invites.insert(&i, &())?; + + Ok(LayoutPage { + title: "Admin Dashboard".to_string(), + content: markup::new! { + pre { code { @i } } + }, + }) +} + +#[derive(FromForm)] +pub struct DeleteUser { + name: String, +} + +#[post("/account/admin/remove_user", data = "<form>")] +pub fn r_account_admin_remove_user( + session: Session, + database: &State<Database>, + form: Form<DeleteUser>, +) -> MyResult<DynLayoutPage<'static>> { + if !session.user.admin { + Err(anyhow!("you not admin"))? + } + database + .users + .remove(&form.name)? + .ok_or(anyhow!("user did not exist"))?; + + Ok(LayoutPage { + title: "User removed".to_string(), + content: markup::new! { + p { "User removed" } + }, + }) +} diff --git a/server/src/routes/ui/account/mod.rs b/server/src/routes/ui/account/mod.rs index bdc6062..e39ef6c 100644 --- a/server/src/routes/ui/account/mod.rs +++ b/server/src/routes/ui/account/mod.rs @@ -1,3 +1,4 @@ +pub mod admin; pub mod session; use super::error::MyError; @@ -18,7 +19,7 @@ use rocket::{get, post, uri, FromForm, State}; #[derive(FromForm)] pub struct RegisterForm { - #[field(validate = len(8..32))] + #[field(validate = len(8..128))] pub invitation: String, #[field(validate = len(4..32))] pub username: String, @@ -108,7 +109,7 @@ pub fn r_account_register_post<'a>( Some(&User { display_name: form.username.clone(), name: form.username.clone(), - password: form.password.clone().into(), // TODO hash it + password: hash_password(&form.password), admin: false, }), ) |