aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-24 17:56:16 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-24 17:56:16 +0100
commit6949f8d40d1784d5a9c54dbe44e212fe2fae76f4 (patch)
tree6c3851aa40ba37945bcbc0e78d53d6aea569586e /server
parente7ed6eecbd9ccce486b34454fe77d71a22d1bfe2 (diff)
downloadjellything-6949f8d40d1784d5a9c54dbe44e212fe2fae76f4.tar
jellything-6949f8d40d1784d5a9c54dbe44e212fe2fae76f4.tar.bz2
jellything-6949f8d40d1784d5a9c54dbe44e212fe2fae76f4.tar.zst
user list
Diffstat (limited to 'server')
-rw-r--r--server/src/routes.rs26
-rw-r--r--server/src/ui/admin/mod.rs34
-rw-r--r--server/src/ui/admin/user.rs93
-rw-r--r--server/src/ui/mod.rs1
-rw-r--r--server/src/ui/user.rs28
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"),
+ ))
+}