aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/admin/user.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/admin/user.rs')
-rw-r--r--server/src/routes/ui/admin/user.rs67
1 files changed, 22 insertions, 45 deletions
diff --git a/server/src/routes/ui/admin/user.rs b/server/src/routes/ui/admin/user.rs
index 524f849..7ba6d4e 100644
--- a/server/src/routes/ui/admin/user.rs
+++ b/server/src/routes/ui/admin/user.rs
@@ -4,7 +4,7 @@
Copyright (C) 2025 metamuffin <metamuffin.org>
*/
use crate::{
- database::DataAcid,
+ database::Database,
routes::ui::{
account::session::AdminSession,
error::MyResult,
@@ -13,36 +13,23 @@ use crate::{
uri,
};
use anyhow::{anyhow, Context};
-use jellybase::database::{redb::ReadableTable, Ser, TableExt, T_USER};
use jellycommon::user::{PermissionSet, UserPermission};
use rocket::{form::Form, get, post, FromForm, FromFormField, State};
#[get("/admin/users")]
pub fn r_admin_users(
_session: AdminSession,
- database: &State<DataAcid>,
+ database: &State<Database>,
) -> MyResult<DynLayoutPage<'static>> {
user_management(database, None)
}
fn user_management<'a>(
- database: &DataAcid,
+ database: &Database,
flash: Option<MyResult<String>>,
) -> MyResult<DynLayoutPage<'a>> {
// TODO this doesnt scale, pagination!
- let users = {
- let txn = database.begin_read()?;
- let table = txn.open_table(T_USER)?;
- let i = table
- .iter()?
- .map(|a| {
- let (x, y) = a.unwrap();
- (x.value().to_owned(), y.value().0)
- })
- .collect::<Vec<_>>();
- drop(table);
- i
- };
+ let users = database.list_users()?;
let flash = flash.map(|f| f.map_err(|e| format!("{e:?}")));
Ok(LayoutPage {
@@ -51,7 +38,7 @@ fn user_management<'a>(
h1 { "User Management" }
@FlashDisplay { flash: flash.clone() }
h2 { "All Users" }
- ul { @for (_, u) in &users {
+ ul { @for u in &users {
li {
a[href=uri!(r_admin_user(&u.name))] { @format!("{:?}", u.display_name) " (" @u.name ")" }
}
@@ -64,19 +51,19 @@ fn user_management<'a>(
#[get("/admin/user/<name>")]
pub fn r_admin_user<'a>(
_session: AdminSession,
- database: &State<DataAcid>,
+ database: &State<Database>,
name: &'a str,
) -> MyResult<DynLayoutPage<'a>> {
manage_single_user(database, None, name.to_string())
}
fn manage_single_user<'a>(
- database: &DataAcid,
+ database: &Database,
flash: Option<MyResult<String>>,
name: String,
) -> MyResult<DynLayoutPage<'a>> {
- let user = T_USER
- .get(database, &*name)?
+ let user = database
+ .get_user(&name)?
.ok_or(anyhow!("user does not exist"))?;
let flash = flash.map(|f| f.map_err(|e| format!("{e:?}")));
@@ -152,31 +139,21 @@ pub enum GrantState {
#[post("/admin/update_user_permission", data = "<form>")]
pub fn r_admin_user_permission(
session: AdminSession,
- database: &State<DataAcid>,
+ database: &State<Database>,
form: Form<UserPermissionForm>,
) -> MyResult<DynLayoutPage<'static>> {
drop(session);
let perm = serde_json::from_str::<UserPermission>(&form.permission)
.context("parsing provided permission")?;
- let txn = database.begin_write()?;
- let mut users = txn.open_table(T_USER)?;
-
- let mut user = users
- .get(&*form.name)?
- .ok_or(anyhow!("user missing"))?
- .value()
- .0;
-
- match form.action {
- GrantState::Grant => drop(user.permissions.0.insert(perm.clone(), true)),
- GrantState::Revoke => drop(user.permissions.0.insert(perm.clone(), false)),
- GrantState::Unset => drop(user.permissions.0.remove(&perm)),
- }
-
- users.insert(&*form.name, Ser(user))?;
- drop(users);
- txn.commit()?;
+ database.update_user(&form.name, |user| {
+ match form.action {
+ GrantState::Grant => drop(user.permissions.0.insert(perm.clone(), true)),
+ GrantState::Revoke => drop(user.permissions.0.insert(perm.clone(), false)),
+ GrantState::Unset => drop(user.permissions.0.remove(&perm)),
+ }
+ Ok(())
+ })?;
manage_single_user(
database,
@@ -188,12 +165,12 @@ pub fn r_admin_user_permission(
#[post("/admin/remove_user", data = "<form>")]
pub fn r_admin_remove_user(
session: AdminSession,
- database: &State<DataAcid>,
+ database: &State<Database>,
form: Form<DeleteUser>,
) -> MyResult<DynLayoutPage<'static>> {
drop(session);
- T_USER
- .remove(database, form.name.as_str())?
- .ok_or(anyhow!("user did not exist"))?;
+ if !database.delete_user(&form.name)? {
+ Err(anyhow!("user did not exist"))?;
+ }
user_management(database, Some(Ok("User removed".into())))
}