diff options
Diffstat (limited to 'server/src/routes/ui/admin/mod.rs')
-rw-r--r-- | server/src/routes/ui/admin/mod.rs | 170 |
1 files changed, 73 insertions, 97 deletions
diff --git a/server/src/routes/ui/admin/mod.rs b/server/src/routes/ui/admin/mod.rs index 1fba6c0..160999b 100644 --- a/server/src/routes/ui/admin/mod.rs +++ b/server/src/routes/ui/admin/mod.rs @@ -6,12 +6,9 @@ pub mod log; pub mod user; -use super::{ - account::session::AdminSession, - assets::{resolve_asset, AVIF_QUALITY, AVIF_SPEED}, -}; +use super::account::session::AdminSession; use crate::{ - database::DataAcid, + database::Database, routes::ui::{ admin::log::rocket_uri_macro_r_admin_log, error::MyResult, @@ -20,16 +17,7 @@ use crate::{ uri, }; use anyhow::{anyhow, Context}; -use humansize::{format_size, DECIMAL}; -use jellybase::{ - assetfed::AssetInner, - database::{ - redb::{ReadableTable, ReadableTableMetadata}, - tantivy::query::Bm25StatisticsProvider, - TableExt, T_INVITE, T_NODE, T_USER_NODE, - }, - CONF, -}; +use jellybase::CONF; use markup::DynRender; use rand::Rng; use rocket::{form::Form, get, post, FromForm, State}; @@ -40,28 +28,16 @@ use user::rocket_uri_macro_r_admin_users; #[get("/admin/dashboard")] pub async fn r_admin_dashboard( _session: AdminSession, - database: &State<DataAcid>, + database: &State<Database>, ) -> MyResult<DynLayoutPage<'static>> { admin_dashboard(database, None).await } pub async fn admin_dashboard<'a>( - database: &DataAcid, + database: &Database, flash: Option<MyResult<String>>, ) -> MyResult<DynLayoutPage<'a>> { - let invites = { - let txn = database.begin_read()?; - let table = txn.open_table(T_INVITE)?; - let i = table - .iter()? - .map(|a| { - let (x, _) = a.unwrap(); - x.value().to_owned() - }) - .collect::<Vec<_>>(); - drop(table); - i - }; + let invites = database.list_invites()?; let flash = flash.map(|f| f.map_err(|e| format!("{e:?}"))); // let last_import_err = IMPORT_ERRORS.read().await.to_owned(); @@ -129,11 +105,10 @@ pub async fn admin_dashboard<'a>( #[post("/admin/generate_invite")] pub async fn r_admin_invite( _session: AdminSession, - database: &State<DataAcid>, + database: &State<Database>, ) -> MyResult<DynLayoutPage<'static>> { let i = format!("{}", rand::rng().random::<u128>()); - T_INVITE.insert(database, &*i, ())?; - + database.create_invite(&i)?; admin_dashboard(database, Some(Ok(format!("Invite: {}", i)))).await } @@ -145,14 +120,13 @@ pub struct DeleteInvite { #[post("/admin/remove_invite", data = "<form>")] pub async fn r_admin_remove_invite( session: AdminSession, - database: &State<DataAcid>, + database: &State<Database>, form: Form<DeleteInvite>, ) -> MyResult<DynLayoutPage<'static>> { drop(session); - T_INVITE - .remove(database, form.invite.as_str())? - .ok_or(anyhow!("invite did not exist"))?; - + if !database.delete_invite(&form.invite)? { + Err(anyhow!("invite does not exist"))?; + }; admin_dashboard(database, Some(Ok("Invite invalidated".into()))).await } @@ -178,7 +152,7 @@ pub async fn r_admin_remove_invite( #[post("/admin/delete_cache")] pub async fn r_admin_delete_cache( session: AdminSession, - database: &State<DataAcid>, + database: &State<Database>, ) -> MyResult<DynLayoutPage<'static>> { drop(session); let t = Instant::now(); @@ -202,7 +176,7 @@ fn is_transcoding() -> bool { #[post("/admin/transcode_posters")] pub async fn r_admin_transcode_posters( session: AdminSession, - database: &State<DataAcid>, + database: &State<Database>, ) -> MyResult<DynLayoutPage<'static>> { drop(session); let _permit = SEM_TRANSCODING @@ -211,24 +185,25 @@ pub async fn r_admin_transcode_posters( let t = Instant::now(); - { - let txn = database.begin_read()?; - let nodes = txn.open_table(T_NODE)?; - for node in nodes.iter()? { - let (_, node) = node?; - if let Some(poster) = &node.value().0.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); + // TODO + // { + // let txn = database.begin_read()?; + // let nodes = txn.open_table(T_NODE)?; + // for node in nodes.iter()? { + // let (_, node) = node?; + // if let Some(poster) = &node.value().0.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, @@ -240,47 +215,48 @@ pub async fn r_admin_transcode_posters( .await } -fn db_stats(db: &DataAcid) -> anyhow::Result<DynRender> { - let txn = db.inner.begin_read()?; - let stats = [ - ("node", txn.open_table(T_NODE)?.stats()?), - ("user", txn.open_table(T_USER_NODE)?.stats()?), - ("user-node", txn.open_table(T_USER_NODE)?.stats()?), - ("invite", txn.open_table(T_INVITE)?.stats()?), - ]; +fn db_stats(_db: &Database) -> anyhow::Result<DynRender> { + // TODO + // let txn = db.inner.begin_read()?; + // let stats = [ + // ("node", txn.open_table(T_NODE)?.stats()?), + // ("user", txn.open_table(T_USER_NODE)?.stats()?), + // ("user-node", txn.open_table(T_USER_NODE)?.stats()?), + // ("invite", txn.open_table(T_INVITE)?.stats()?), + // ]; - let cache_stats = db.node_index.reader.searcher().doc_store_cache_stats(); - let ft_total_docs = db.node_index.reader.searcher().total_num_docs()?; + // let cache_stats = db.node_index.reader.searcher().doc_store_cache_stats(); + // let ft_total_docs = db.node_index.reader.searcher().total_num_docs()?; Ok(markup::new! { - h3 { "Key-Value-Store Statistics" } - table.border { - tbody { - tr { - th { "table name" } - th { "tree height" } - th { "stored bytes" } - th { "metadata bytes" } - th { "fragmented bytes" } - th { "branch pages" } - th { "leaf pages" } - } - @for (name, stats) in &stats { tr { - td { @name } - td { @stats.tree_height() } - td { @format_size(stats.stored_bytes(), DECIMAL) } - td { @format_size(stats.metadata_bytes(), DECIMAL) } - td { @format_size(stats.fragmented_bytes(), DECIMAL) } - td { @stats.branch_pages() } - td { @stats.leaf_pages() } - }} - } - } - h3 { "Search Engine Statistics" } - ul { - li { "Total documents: " @ft_total_docs } - li { "Cache misses: " @cache_stats.cache_misses } - li { "Cache hits: " @cache_stats.cache_hits } - } + // h3 { "Key-Value-Store Statistics" } + // table.border { + // tbody { + // tr { + // th { "table name" } + // th { "tree height" } + // th { "stored bytes" } + // th { "metadata bytes" } + // th { "fragmented bytes" } + // th { "branch pages" } + // th { "leaf pages" } + // } + // @for (name, stats) in &stats { tr { + // td { @name } + // td { @stats.tree_height() } + // td { @format_size(stats.stored_bytes(), DECIMAL) } + // td { @format_size(stats.metadata_bytes(), DECIMAL) } + // td { @format_size(stats.fragmented_bytes(), DECIMAL) } + // td { @stats.branch_pages() } + // td { @stats.leaf_pages() } + // }} + // } + // } + // h3 { "Search Engine Statistics" } + // ul { + // li { "Total documents: " @ft_total_docs } + // li { "Cache misses: " @cache_stats.cache_misses } + // li { "Cache hits: " @cache_stats.cache_hits } + // } }) } |