aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/admin/mod.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-05-26 18:24:16 +0200
committermetamuffin <metamuffin@disroot.org>2025-05-26 18:24:16 +0200
commit3b15caade07e8fbe351fed9aceb3f435bf58368e (patch)
treecce91c229b78061ad36f29d76a76d67c3c737c59 /server/src/ui/admin/mod.rs
parent1eeff5c03e8985d16d4f2b6283741dd82b369bd3 (diff)
downloadjellything-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/mod.rs')
-rw-r--r--server/src/ui/admin/mod.rs120
1 files changed, 15 insertions, 105 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()))
}