diff options
Diffstat (limited to 'server/src/ui/admin/user.rs')
-rw-r--r-- | server/src/ui/admin/user.rs | 140 |
1 files changed, 85 insertions, 55 deletions
diff --git a/server/src/ui/admin/user.rs b/server/src/ui/admin/user.rs index 1af83d4..77bcc71 100644 --- a/server/src/ui/admin/user.rs +++ b/server/src/ui/admin/user.rs @@ -3,68 +3,68 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin <metamuffin.org> */ -use crate::{database::Database, ui::error::MyResult}; +use crate::{database::Database, locale::AcceptLanguage, ui::error::MyResult}; use anyhow::{anyhow, Context}; use jellycommon::user::UserPermission; -use jellylogic::session::AdminSession; -use rocket::{form::Form, get, post, FromForm, FromFormField, State}; +use jellyimport::is_importing; +use jellylogic::{admin::user::admin_users, session::AdminSession}; +use jellyui::{ + admin::user::{AdminUserPage, AdminUsersPage}, + render_page, + scaffold::{RenderInfo, SessionInfo}, +}; +use rocket::{form::Form, get, post, response::content::RawHtml, FromForm, FromFormField, State}; #[get("/admin/users")] pub fn r_admin_users( - _session: AdminSession, + session: AdminSession, database: &State<Database>, -) -> MyResult<DynLayoutPage<'static>> { - user_management(database, None) -} - -fn user_management<'a>( - database: &Database, - flash: Option<MyResult<String>>, -) -> MyResult<DynLayoutPage<'a>> { - // TODO this doesnt scale, pagination! - let users = database.list_users()?; - 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 ")" } - } - }} + lang: AcceptLanguage, +) -> MyResult<RawHtml<String>> { + let AcceptLanguage(lang) = lang; + let r = admin_users(database, &session)?; + Ok(RawHtml(render_page( + &AdminUsersPage { + flash: None, + lang: &lang, + users: &r.users, + }, + RenderInfo { + importing: is_importing(), + session: Some(SessionInfo { + user: session.0.user, + }), }, - ..Default::default() - }) + lang, + ))) } #[get("/admin/user/<name>")] pub fn r_admin_user<'a>( - _session: AdminSession, + session: AdminSession, database: &State<Database>, name: &'a str, -) -> MyResult<DynLayoutPage<'a>> { - manage_single_user(database, None, name.to_string()) -} - -fn manage_single_user<'a>( - database: &Database, - flash: Option<MyResult<String>>, - name: String, -) -> MyResult<DynLayoutPage<'a>> { + lang: AcceptLanguage, +) -> MyResult<RawHtml<String>> { + let AcceptLanguage(lang) = lang; let user = database .get_user(&name)? .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! {}, - ..Default::default() - }) + Ok(RawHtml(render_page( + &AdminUserPage { + flash: None, + lang: &lang, + user: &user, + }, + RenderInfo { + importing: is_importing(), + session: Some(SessionInfo { + user: session.0.user, + }), + }, + lang, + ))) } #[derive(FromForm)] @@ -86,8 +86,9 @@ pub fn r_admin_user_permission( database: &State<Database>, form: Form<UserPermissionForm>, name: &str, -) -> MyResult<DynLayoutPage<'static>> { - drop(session); + lang: AcceptLanguage, +) -> MyResult<RawHtml<String>> { + let AcceptLanguage(lang) = lang; let perm = serde_json::from_str::<UserPermission>(&form.permission) .context("parsing provided permission")?; @@ -100,11 +101,24 @@ pub fn r_admin_user_permission( Ok(()) })?; - manage_single_user( - database, - Some(Ok("Permissions update".into())), - form.name.clone(), - ) + let user = database + .get_user(&name)? + .ok_or(anyhow!("user does not exist"))?; + + Ok(RawHtml(render_page( + &AdminUserPage { + flash: Some(Ok("Permissions updated".to_string())), + lang: &lang, + user: &user, + }, + RenderInfo { + importing: is_importing(), + session: Some(SessionInfo { + user: session.0.user, + }), + }, + lang, + ))) } #[post("/admin/<name>/remove")] @@ -112,10 +126,26 @@ pub fn r_admin_remove_user( session: AdminSession, database: &State<Database>, name: &str, -) -> MyResult<DynLayoutPage<'static>> { - drop(session); + lang: AcceptLanguage, +) -> MyResult<RawHtml<String>> { + let AcceptLanguage(lang) = lang; if !database.delete_user(&name)? { Err(anyhow!("user did not exist"))?; } - user_management(database, Some(Ok("User removed".into()))) + let r = admin_users(database, &session)?; + + Ok(RawHtml(render_page( + &AdminUsersPage { + flash: Some(Ok("User removed".to_string())), + lang: &lang, + users: &r.users, + }, + RenderInfo { + importing: is_importing(), + session: Some(SessionInfo { + user: session.0.user, + }), + }, + lang, + ))) } |