use crate::{ database::Database, routes::ui::{ account::session::AdminSession, error::MyResult, layout::{DynLayoutPage, FlashDisplay, LayoutPage}, }, uri, }; use anyhow::anyhow; use rocket::{form::Form, get, post, FromForm, State}; #[get("/admin/users")] pub fn r_admin_users( _session: AdminSession, database: &State, ) -> MyResult> { user_management(database, None) } fn user_management<'a>( database: &Database, flash: Option>, ) -> MyResult> { // TODO this doesnt scale, pagination! let users = database.user.iter().collect::, _>>()?; let flash = flash.map(|f| f.map_err(|e| format!("{e:?}"))); Ok(LayoutPage { title: "User management".to_string(), content: markup::new! { h1 { "User Management" } @FlashDisplay { flash: flash.clone() } h2 { "All Users" } ul { @for (_, u) in &users { li { a[href=uri!(r_admin_user(&u.name))] { @format!("{:?}", u.display_name) " (" @u.name ")" } } }} }, ..Default::default() }) } #[get("/admin/user/")] pub fn r_admin_user<'a>( _session: AdminSession, database: &State, name: &'a str, ) -> MyResult> { manage_single_user(database, None, name) } fn manage_single_user<'a>( database: &Database, flash: Option>, name: &'a str, ) -> MyResult> { // TODO this doesnt scale, pagination! let user = database .user .get(&name.to_string())? .ok_or(anyhow!("user does not exist"))?; let flash = flash.map(|f| f.map_err(|e| format!("{e:?}"))); Ok(LayoutPage { title: "User management".to_string(), content: markup::new! { h1 { "Manage User" } @FlashDisplay { flash: flash.clone() } h2 { @format!("{:?}", user.display_name) " (" @user.name ")" } form[method="POST", action=uri!(r_admin_remove_user())] { input[type="text", name="name", value=&user.name, hidden]; input[type="submit", value="Remove(!)"]; } }, ..Default::default() }) } #[derive(FromForm)] pub struct DeleteUser { name: String, } #[post("/admin/remove_user", data = "
")] pub fn r_admin_remove_user( session: AdminSession, database: &State, form: Form, ) -> MyResult> { drop(session); database .user .remove(&form.name)? .ok_or(anyhow!("user did not exist"))?; user_management(database, Some(Ok("User removed".into()))) }