diff options
author | metamuffin <metamuffin@disroot.org> | 2025-05-26 18:24:16 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-05-26 18:24:16 +0200 |
commit | 3b15caade07e8fbe351fed9aceb3f435bf58368e (patch) | |
tree | cce91c229b78061ad36f29d76a76d67c3c737c59 /server/src/ui/admin | |
parent | 1eeff5c03e8985d16d4f2b6283741dd82b369bd3 (diff) | |
download | jellything-3b15caade07e8fbe351fed9aceb3f435bf58368e.tar jellything-3b15caade07e8fbe351fed9aceb3f435bf58368e.tar.bz2 jellything-3b15caade07e8fbe351fed9aceb3f435bf58368e.tar.zst |
move all direct database access to logic crate
Diffstat (limited to 'server/src/ui/admin')
-rw-r--r-- | server/src/ui/admin/mod.rs | 120 | ||||
-rw-r--r-- | server/src/ui/admin/user.rs | 54 |
2 files changed, 38 insertions, 136 deletions
diff --git a/server/src/ui/admin/mod.rs b/server/src/ui/admin/mod.rs index 942f4f8..e3eb2d6 100644 --- a/server/src/ui/admin/mod.rs +++ b/server/src/ui/admin/mod.rs @@ -6,50 +6,42 @@ pub mod log; pub mod user; -use super::{ - assets::{resolve_asset, AVIF_QUALITY, AVIF_SPEED}, - error::MyResult, -}; +use super::error::MyResult; use crate::helper::{language::AcceptLanguage, A}; -use anyhow::{anyhow, Context}; use jellycommon::routes::u_admin_dashboard; -use jellyimport::{asset_token::AssetInner, import_wrap, is_importing}; +use jellyimport::is_importing; use jellylogic::{ - admin::{get_import_errors, list_invites}, + admin::{ + create_invite, delete_invite, do_import, get_import_errors, list_invites, + update_search_index, + }, session::AdminSession, - Database, }; use jellyui::{ admin::AdminDashboardPage, render_page, scaffold::{RenderInfo, SessionInfo}, }; -use rand::Rng; use rocket::{ form::Form, get, post, response::{content::RawHtml, Redirect}, - FromForm, State, + FromForm, }; -use std::time::Instant; -use tokio::{sync::Semaphore, task::spawn_blocking}; #[get("/admin/dashboard")] pub async fn r_admin_dashboard( session: A<AdminSession>, - database: &State<Database>, lang: AcceptLanguage, ) -> MyResult<RawHtml<String>> { let AcceptLanguage(lang) = lang; let flash = None; - let invites = list_invites(&session.0, database)?; + let invites = list_invites(&session.0)?; let last_import_err = get_import_errors(&session.0).await; let busy = if is_importing() { Some("An import is currently running.") - } else if is_transcoding() { - Some("Currently transcoding posters.") } else { None }; @@ -73,13 +65,8 @@ pub async fn r_admin_dashboard( } #[post("/admin/generate_invite")] -pub async fn r_admin_invite( - _session: A<AdminSession>, - database: &State<Database>, -) -> MyResult<Redirect> { - let i = format!("{}", rand::rng().random::<u128>()); - database.create_invite(&i)?; - // admin_dashboard(database, Some(Ok(format!("Invite: {}", i)))).await +pub async fn r_admin_invite(session: A<AdminSession>) -> MyResult<Redirect> { + let _ = create_invite(&session.0)?; Ok(Redirect::temporary(u_admin_dashboard())) } @@ -91,97 +78,20 @@ pub struct DeleteInvite { #[post("/admin/remove_invite", data = "<form>")] pub async fn r_admin_remove_invite( session: A<AdminSession>, - database: &State<Database>, form: Form<DeleteInvite>, ) -> MyResult<Redirect> { - drop(session); - if !database.delete_invite(&form.invite)? { - Err(anyhow!("invite does not exist"))?; - }; - // admin_dashboard(database, Some(Ok("Invite invalidated".into()))).await + delete_invite(&session.0, &form.invite)?; Ok(Redirect::temporary(u_admin_dashboard())) } #[post("/admin/import?<incremental>")] -pub async fn r_admin_import( - session: A<AdminSession>, - database: &State<Database>, - incremental: bool, -) -> MyResult<Redirect> { - drop(session); - let t = Instant::now(); - if !incremental { - database.clear_nodes()?; - } - let r = import_wrap((*database).clone(), incremental).await; - // let flash = r - // .map_err(|e| e.into()) - // .map(|_| format!("Import successful; took {:?}", t.elapsed())); - // admin_dashboard(database, Some(flash)).await +pub async fn r_admin_import(session: A<AdminSession>, incremental: bool) -> MyResult<Redirect> { + do_import(&session.0, incremental).await?.1?; Ok(Redirect::temporary(u_admin_dashboard())) } #[post("/admin/update_search")] -pub async fn r_admin_update_search( - _session: A<AdminSession>, - database: &State<Database>, -) -> MyResult<Redirect> { - let db2 = (*database).clone(); - let r = spawn_blocking(move || db2.search_create_index()) - .await - .unwrap(); - // admin_dashboard( - // database, - // Some( - // r.map_err(|e| e.into()) - // .map(|_| "Search index updated".to_string()), - // ), - // ) - // .await - Ok(Redirect::temporary(u_admin_dashboard())) -} - -static SEM_TRANSCODING: Semaphore = Semaphore::const_new(1); -fn is_transcoding() -> bool { - SEM_TRANSCODING.available_permits() == 0 -} - -#[post("/admin/transcode_posters")] -pub async fn r_admin_transcode_posters( - session: A<AdminSession>, - database: &State<Database>, -) -> MyResult<Redirect> { - drop(session); - let _permit = SEM_TRANSCODING - .try_acquire() - .context("transcoding in progress")?; - - let t = Instant::now(); - - { - let nodes = database.list_nodes_with_udata("")?; - for (node, _) in nodes { - if let Some(poster) = &node.poster { - let asset = AssetInner::deser(&poster.0)?; - if asset.is_federated() { - continue; - } - let source = resolve_asset(asset).await.context("resolving asset")?; - jellytranscoder::image::transcode(&source, AVIF_QUALITY, AVIF_SPEED, 1024) - .await - .context("transcoding asset")?; - } - } - } - drop(_permit); - - // admin_dashboard( - // database, - // Some(Ok(format!( - // "All posters pre-transcoded; took {:?}", - // t.elapsed() - // ))), - // ) - // .await +pub async fn r_admin_update_search(session: A<AdminSession>) -> MyResult<Redirect> { + update_search_index(&session.0).await?; Ok(Redirect::temporary(u_admin_dashboard())) } diff --git a/server/src/ui/admin/user.rs b/server/src/ui/admin/user.rs index 939ee83..27d5256 100644 --- a/server/src/ui/admin/user.rs +++ b/server/src/ui/admin/user.rs @@ -7,25 +7,24 @@ use crate::{ helper::{language::AcceptLanguage, A}, ui::error::MyResult, }; -use anyhow::{anyhow, Context}; +use anyhow::Context; use jellycommon::user::UserPermission; use jellyimport::is_importing; -use jellylogic::{admin::user::admin_users, session::AdminSession, Database}; +use jellylogic::{ + admin::user::{admin_users, delete_user, get_user, update_user_perms, GrantState}, + 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}; +use rocket::{form::Form, get, post, response::content::RawHtml, FromForm, FromFormField}; #[get("/admin/users")] -pub fn r_admin_users( - session: A<AdminSession>, - database: &State<Database>, - lang: AcceptLanguage, -) -> MyResult<RawHtml<String>> { +pub fn r_admin_users(session: A<AdminSession>, lang: AcceptLanguage) -> MyResult<RawHtml<String>> { let AcceptLanguage(lang) = lang; - let r = admin_users(database, &session.0)?; + let r = admin_users(&session.0)?; Ok(RawHtml(render_page( &AdminUsersPage { flash: None, @@ -45,14 +44,11 @@ pub fn r_admin_users( #[get("/admin/user/<name>")] pub fn r_admin_user<'a>( session: A<AdminSession>, - database: &State<Database>, name: &'a str, lang: AcceptLanguage, ) -> MyResult<RawHtml<String>> { let AcceptLanguage(lang) = lang; - let user = database - .get_user(&name)? - .ok_or(anyhow!("user does not exist"))?; + let user = get_user(&session.0, name)?; Ok(RawHtml(render_page( &AdminUserPage { @@ -73,11 +69,11 @@ pub fn r_admin_user<'a>( #[derive(FromForm)] pub struct UserPermissionForm { permission: String, - action: GrantState, + action: UrlGrantState, } #[derive(FromFormField)] -pub enum GrantState { +pub enum UrlGrantState { Grant, Revoke, Unset, @@ -86,7 +82,6 @@ pub enum GrantState { #[post("/admin/user/<name>/update_permission", data = "<form>")] pub fn r_admin_user_permission( session: A<AdminSession>, - database: &State<Database>, form: Form<UserPermissionForm>, name: &str, lang: AcceptLanguage, @@ -95,18 +90,18 @@ pub fn r_admin_user_permission( let perm = serde_json::from_str::<UserPermission>(&form.permission) .context("parsing provided permission")?; - database.update_user(name, |user| { + update_user_perms( + &session.0, + name, + perm, 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(()) - })?; + UrlGrantState::Grant => GrantState::Grant, + UrlGrantState::Revoke => GrantState::Revoke, + UrlGrantState::Unset => GrantState::Unset, + }, + )?; - let user = database - .get_user(&name)? - .ok_or(anyhow!("user does not exist"))?; + let user = get_user(&session.0, name)?; Ok(RawHtml(render_page( &AdminUserPage { @@ -127,15 +122,12 @@ pub fn r_admin_user_permission( #[post("/admin/<name>/remove")] pub fn r_admin_remove_user( session: A<AdminSession>, - database: &State<Database>, name: &str, lang: AcceptLanguage, ) -> MyResult<RawHtml<String>> { let AcceptLanguage(lang) = lang; - if !database.delete_user(&name)? { - Err(anyhow!("user did not exist"))?; - } - let r = admin_users(database, &session.0)?; + delete_user(&session.0, name)?; + let r = admin_users(&session.0)?; Ok(RawHtml(render_page( &AdminUsersPage { |