aboutsummaryrefslogtreecommitdiff
path: root/logic/src/admin
diff options
context:
space:
mode:
Diffstat (limited to 'logic/src/admin')
-rw-r--r--logic/src/admin/mod.rs40
-rw-r--r--logic/src/admin/user.rs46
2 files changed, 74 insertions, 12 deletions
diff --git a/logic/src/admin/mod.rs b/logic/src/admin/mod.rs
index 2545ba4..804cb2b 100644
--- a/logic/src/admin/mod.rs
+++ b/logic/src/admin/mod.rs
@@ -7,14 +7,42 @@
pub mod log;
pub mod user;
-use crate::session::AdminSession;
-use anyhow::Result;
-use jellydb::Database;
-use jellyimport::IMPORT_ERRORS;
+use crate::{DATABASE, session::AdminSession};
+use anyhow::{Result, anyhow};
+use jellyimport::{IMPORT_ERRORS, import_wrap};
+use rand::Rng;
+use std::time::{Duration, Instant};
+use tokio::task::spawn_blocking;
pub async fn get_import_errors(_session: &AdminSession) -> Vec<String> {
IMPORT_ERRORS.read().await.to_owned()
}
-pub fn list_invites(_session: &AdminSession, database: &Database) -> Result<Vec<String>> {
- database.list_invites()
+pub fn list_invites(_session: &AdminSession) -> Result<Vec<String>> {
+ DATABASE.list_invites()
+}
+
+pub fn create_invite(_session: &AdminSession) -> Result<String> {
+ let i = format!("{}", rand::rng().random::<u128>());
+ DATABASE.create_invite(&i)?;
+ Ok(i)
+}
+pub fn delete_invite(_session: &AdminSession, invite: &str) -> Result<()> {
+ if !DATABASE.delete_invite(invite)? {
+ Err(anyhow!("invite does not exist"))?;
+ };
+ Ok(())
+}
+pub async fn update_search_index(_session: &AdminSession) -> Result<()> {
+ spawn_blocking(move || DATABASE.search_create_index()).await?
+}
+pub async fn do_import(
+ _session: &AdminSession,
+ incremental: bool,
+) -> Result<(Duration, Result<()>)> {
+ let t = Instant::now();
+ if !incremental {
+ DATABASE.clear_nodes()?;
+ }
+ let r = import_wrap((*DATABASE).clone(), incremental).await;
+ Ok((t.elapsed(), r))
}
diff --git a/logic/src/admin/user.rs b/logic/src/admin/user.rs
index 3ec3852..e277077 100644
--- a/logic/src/admin/user.rs
+++ b/logic/src/admin/user.rs
@@ -4,14 +4,48 @@
Copyright (C) 2025 metamuffin <metamuffin.org>
*/
-use crate::session::AdminSession;
-use anyhow::Result;
-use jellycommon::api::ApiAdminUsersResponse;
-use jellydb::Database;
+use crate::{DATABASE, session::AdminSession};
+use anyhow::{Result, anyhow};
+use jellycommon::{
+ api::ApiAdminUsersResponse,
+ user::{User, UserPermission},
+};
-pub fn admin_users(db: &Database, _session: &AdminSession) -> Result<ApiAdminUsersResponse> {
+pub fn admin_users(_session: &AdminSession) -> Result<ApiAdminUsersResponse> {
// TODO dont return useless info like passwords
Ok(ApiAdminUsersResponse {
- users: db.list_users()?,
+ users: DATABASE.list_users()?,
+ })
+}
+pub fn get_user(_session: &AdminSession, username: &str) -> Result<User> {
+ DATABASE
+ .get_user(username)?
+ .ok_or(anyhow!("user not found"))
+}
+pub fn delete_user(_session: &AdminSession, username: &str) -> Result<()> {
+ if !DATABASE.delete_user(&username)? {
+ Err(anyhow!("user did not exist"))?;
+ }
+ Ok(())
+}
+
+pub enum GrantState {
+ Grant,
+ Revoke,
+ Unset,
+}
+pub fn update_user_perms(
+ _session: &AdminSession,
+ username: &str,
+ perm: UserPermission,
+ action: GrantState,
+) -> Result<()> {
+ DATABASE.update_user(username, |user| {
+ match 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(())
})
}