diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-24 17:56:16 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-24 17:56:16 +0100 |
| commit | 6949f8d40d1784d5a9c54dbe44e212fe2fae76f4 (patch) | |
| tree | 6c3851aa40ba37945bcbc0e78d53d6aea569586e /server | |
| parent | e7ed6eecbd9ccce486b34454fe77d71a22d1bfe2 (diff) | |
| download | jellything-6949f8d40d1784d5a9c54dbe44e212fe2fae76f4.tar jellything-6949f8d40d1784d5a9c54dbe44e212fe2fae76f4.tar.bz2 jellything-6949f8d40d1784d5a9c54dbe44e212fe2fae76f4.tar.zst | |
user list
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/routes.rs | 26 | ||||
| -rw-r--r-- | server/src/ui/admin/mod.rs | 34 | ||||
| -rw-r--r-- | server/src/ui/admin/user.rs | 93 | ||||
| -rw-r--r-- | server/src/ui/mod.rs | 1 | ||||
| -rw-r--r-- | server/src/ui/user.rs | 28 |
5 files changed, 67 insertions, 115 deletions
diff --git a/server/src/routes.rs b/server/src/routes.rs index 2b7fed9..7068fe0 100644 --- a/server/src/routes.rs +++ b/server/src/routes.rs @@ -19,7 +19,7 @@ use crate::{ admin::{ import::{r_admin_import, r_admin_import_post, r_admin_import_stream}, log::{r_admin_log, r_admin_log_stream}, - r_admin_dashboard, + r_admin_dashboard, r_admin_users, }, assets::{r_image, r_image_fallback_person}, error::{r_api_catch, r_catch}, @@ -28,6 +28,7 @@ use crate::{ player::r_player, r_favicon, r_index, style::{r_assets_css, r_assets_font, r_assets_js, r_assets_js_map}, + user::{r_user, r_user_remove}, }, }; use rocket::{ @@ -74,29 +75,19 @@ pub(super) fn build_rocket(state: Arc<State>) -> Rocket<Build> { .mount( "/", routes![ - // Frontend r_account_login_post, r_account_login, r_account_logout_post, r_account_logout, - // r_account_register_post, - // r_account_register, r_account_settings_post, r_account_settings, r_admin_dashboard, r_admin_import, r_admin_import_post, r_admin_import_stream, - // r_admin_invite, r_admin_log_stream, r_admin_log, - // r_admin_remove_invite, - // r_admin_remove_user, - // r_admin_update_search, - // r_admin_user_permission, - // r_admin_user, - // r_admin_users, - // r_items, + r_admin_users, r_image, r_image_fallback_person, r_assets_font, @@ -106,19 +97,12 @@ pub(super) fn build_rocket(state: Arc<State>) -> Rocket<Build> { r_favicon, r_home, r_index, - // r_item_poster, + r_user, + r_user_remove, r_node, - // r_node_thumbnail, - // r_node_userdata_progress, - // r_node_userdata_rating, - // r_node_userdata_watched, - // r_node_userdata, r_player, r_playersync, - // r_search, - // r_stats, r_stream, - // API r_api_root, r_version, // Compat diff --git a/server/src/ui/admin/mod.rs b/server/src/ui/admin/mod.rs index 8413ead..3fa0591 100644 --- a/server/src/ui/admin/mod.rs +++ b/server/src/ui/admin/mod.rs @@ -9,9 +9,14 @@ pub mod log; use super::error::MyResult; use crate::{request_info::RequestInfo, ui_responder::UiResponse}; -use jellycommon::{jellyobject::ObjectBuffer, *}; +use jellycommon::{ + jellyobject::{ObjectBuffer, ObjectBufferBuilder}, + *, +}; +use jellydb::Query; use jellyui::tr; use rocket::get; +use std::str::FromStr; #[get("/admin/dashboard")] pub async fn r_admin_dashboard(ri: RequestInfo<'_>) -> MyResult<UiResponse> { @@ -35,3 +40,30 @@ pub async fn r_admin_dashboard(ri: RequestInfo<'_>) -> MyResult<UiResponse> { ), ]))) } + +#[get("/admin/users")] +pub fn r_admin_users(ri: RequestInfo) -> MyResult<UiResponse> { + ri.require_admin()?; + + let mut users = Vec::new(); + ri.state.database.transaction(&mut |txn| { + users.clear(); + let rows = txn + .query(Query::from_str("FILTER Ulgn")?)? + .collect::<Vec<_>>(); + for row in rows { + let (row, _) = row?; + users.push(txn.get(row)?.unwrap()); + } + Ok(()) + })?; + + let mut list = ObjectBufferBuilder::default(); + for u in users { + list.push(ADMIN_USER_LIST_ITEM, u.as_object()); + } + Ok(ri.respond_ui(ObjectBuffer::new(&mut [( + VIEW_ADMIN_USER_LIST.0, + &list.finish().as_object(), + )]))) +} diff --git a/server/src/ui/admin/user.rs b/server/src/ui/admin/user.rs deleted file mode 100644 index b4770c8..0000000 --- a/server/src/ui/admin/user.rs +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of jellything (https://codeberg.org/metamuffin/jellything) - which is licensed under the GNU Affero General Public License (version 3); see /COPYING. - Copyright (C) 2026 metamuffin <metamuffin.org> -*/ -use crate::{request_info::RequestInfo, ui::error::MyResult}; -use anyhow::Context; -use jellycommon::routes::{u_admin_user, u_admin_users}; -use rocket::{ - FromForm, FromFormField, - form::Form, - get, post, - response::{Flash, Redirect, content::RawHtml}, -}; - -#[get("/admin/users")] -pub fn r_admin_users(ri: RequestInfo) -> MyResult<RawHtml<String>> { - ri.session.assert_admin()?; - let r = admin_users(&ri.session)?; - Ok(RawHtml(render_page( - &AdminUsersPage { - flash: &None, - lang: &ri.lang, - users: &r.users, - }, - ri.render_info(), - ))) -} - -#[get("/admin/user/<name>")] -pub fn r_admin_user(ri: RequestInfo, name: &str) -> MyResult<RawHtml<String>> { - ri.session.assert_admin()?; - let user = get_user(&ri.session, name)?; - - Ok(RawHtml(render_page( - &AdminUserPage { - flash: &None, - lang: &ri.lang, - user: &user, - }, - ri.render_info(), - ))) -} - -#[derive(FromForm)] -pub struct UserPermissionForm { - permission: String, - action: UrlGrantState, -} - -#[derive(FromFormField)] -pub enum UrlGrantState { - Grant, - Revoke, - Unset, -} - -#[post("/admin/user/<name>/update_permission", data = "<form>")] -pub fn r_admin_user_permission( - ri: RequestInfo, - form: Form<UserPermissionForm>, - name: &str, -) -> MyResult<Flash<Redirect>> { - ri.session.assert_admin()?; - let perm = serde_json::from_str::<UserPermission>(&form.permission) - .context("parsing provided permission")?; - - update_user_perms( - &ri.session, - name, - perm, - match form.action { - UrlGrantState::Grant => GrantState::Grant, - UrlGrantState::Revoke => GrantState::Revoke, - UrlGrantState::Unset => GrantState::Unset, - }, - )?; - - Ok(Flash::success( - Redirect::to(u_admin_user(name)), - tr(ri.lang, "admin.users.permission_update_success"), - )) -} - -#[post("/admin/<name>/remove")] -pub fn r_admin_remove_user(ri: RequestInfo, name: &str) -> MyResult<Flash<Redirect>> { - ri.session.assert_admin()?; - delete_user(&ri.session, name)?; - Ok(Flash::success( - Redirect::to(u_admin_users()), - tr(ri.lang, "admin.users.remove_success"), - )) -} diff --git a/server/src/ui/mod.rs b/server/src/ui/mod.rs index 116ed3c..28762f1 100644 --- a/server/src/ui/mod.rs +++ b/server/src/ui/mod.rs @@ -18,6 +18,7 @@ pub mod home; pub mod node; pub mod style; pub mod player; +pub mod user; #[get("/")] pub async fn r_index(ri: RequestInfo<'_>) -> MyResult<Redirect> { diff --git a/server/src/ui/user.rs b/server/src/ui/user.rs new file mode 100644 index 0000000..31e521e --- /dev/null +++ b/server/src/ui/user.rs @@ -0,0 +1,28 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2026 metamuffin <metamuffin.org> +*/ +use crate::{request_info::RequestInfo, ui::error::MyResult}; +use jellycommon::routes::u_admin_users; +use jellyui::tr; +use rocket::{ + get, post, + response::{Flash, Redirect, content::RawHtml}, +}; + +#[get("/u/<name>")] +pub fn r_user(ri: RequestInfo<'_>, name: &str) -> MyResult<RawHtml<String>> { + ri.require_user()?; + todo!() +} + +#[post("/u/<name>/remove")] +pub fn r_user_remove(ri: RequestInfo<'_>, name: &str) -> MyResult<Flash<Redirect>> { + ri.require_admin()?; + todo!(); + Ok(Flash::success( + Redirect::to(u_admin_users()), + tr(ri.lang, "admin.users.remove_success"), + )) +} |