diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-12-11 01:20:17 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-12-11 01:20:17 +0100 |
| commit | 6e5f6d9b9c6fedb4ab80190c156595d321d33bbf (patch) | |
| tree | b6c2140e744fc3018ad08975afefad40386ebbc6 /server | |
| parent | e4f865e9da9d6660399e22a6fbeb5b84a749b07a (diff) | |
| download | jellything-6e5f6d9b9c6fedb4ab80190c156595d321d33bbf.tar jellything-6e5f6d9b9c6fedb4ab80190c156595d321d33bbf.tar.bz2 jellything-6e5f6d9b9c6fedb4ab80190c156595d321d33bbf.tar.zst | |
refactor import plugins part 3
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/routes.rs | 14 | ||||
| -rw-r--r-- | server/src/ui/admin/import.rs | 70 | ||||
| -rw-r--r-- | server/src/ui/admin/log.rs | 4 | ||||
| -rw-r--r-- | server/src/ui/admin/mod.rs | 17 |
4 files changed, 84 insertions, 21 deletions
diff --git a/server/src/routes.rs b/server/src/routes.rs index b777788..ed31407 100644 --- a/server/src/routes.rs +++ b/server/src/routes.rs @@ -3,8 +3,10 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin <metamuffin.org> */ -use crate::logic::playersync::{r_playersync, PlayersyncChannels}; +use crate::CONF; +use crate::logic::playersync::{PlayersyncChannels, r_playersync}; use crate::ui::account::{r_account_login, r_account_logout, r_account_register}; +use crate::ui::admin::import::{r_admin_import, r_admin_import_post, r_admin_import_stream}; use crate::ui::{ account::{ r_account_login_post, r_account_logout_post, r_account_register_post, @@ -12,8 +14,7 @@ use crate::ui::{ }, admin::{ log::{r_admin_log, r_admin_log_stream}, - r_admin_dashboard, r_admin_import, r_admin_invite, r_admin_remove_invite, - r_admin_update_search, + r_admin_dashboard, r_admin_invite, r_admin_remove_invite, r_admin_update_search, user::{r_admin_remove_user, r_admin_user, r_admin_user_permission, r_admin_users}, }, assets::{r_image, r_item_poster, r_node_thumbnail}, @@ -27,7 +28,6 @@ use crate::ui::{ stats::r_stats, style::{r_assets_font, r_assets_js, r_assets_js_map, r_assets_style}, }; -use crate::CONF; use crate::{ api::{r_api_account_login, r_api_root, r_nodes_modified_since, r_translations, r_version}, compat::{ @@ -61,8 +61,8 @@ use base64::Engine; use log::warn; use rand::random; use rocket::{ - catchers, config::SecretKey, fairing::AdHoc, fs::FileServer, http::Header, routes, - shield::Shield, Build, Config, Rocket, + Build, Config, Rocket, catchers, config::SecretKey, fairing::AdHoc, fs::FileServer, + http::Header, routes, shield::Shield, }; #[macro_export] @@ -123,6 +123,8 @@ pub fn build_rocket() -> Rocket<Build> { r_account_settings, r_admin_dashboard, r_admin_import, + r_admin_import_post, + r_admin_import_stream, r_admin_invite, r_admin_log_stream, r_admin_log, diff --git a/server/src/ui/admin/import.rs b/server/src/ui/admin/import.rs new file mode 100644 index 0000000..b6bb858 --- /dev/null +++ b/server/src/ui/admin/import.rs @@ -0,0 +1,70 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2025 metamuffin <metamuffin.org> +*/ + +use std::time::Duration; + +use crate::{ + helper::{A, RequestInfo}, + ui::error::MyResult, +}; +use jellycommon::routes::u_admin_import; +use jellyimport::{ + is_importing, + reporting::{IMPORT_ERRORS, IMPORT_PROGRESS}, +}; +use jellylogic::{admin::do_import, session::Session}; +use jellyui::{admin::import::AdminImportPage, locale::tr, render_page}; +use rocket::{ + get, post, + request::FlashMessage, + response::{Flash, Redirect, content::RawHtml}, +}; +use rocket_ws::{Message, Stream, WebSocket}; +use tokio::time::sleep; + +#[get("/admin/import", rank = 2)] +pub async fn r_admin_import( + ri: RequestInfo, + flash: Option<FlashMessage<'_>>, +) -> MyResult<RawHtml<String>> { + ri.session.assert_admin()?; + + let last_import_err = IMPORT_ERRORS.read().await.clone(); + Ok(RawHtml(render_page( + &AdminImportPage { + busy: is_importing(), + flash: &flash.map(FlashMessage::into_inner), + lang: &ri.lang, + last_import_err: &last_import_err, + }, + ri.render_info(), + ))) +} + +#[post("/admin/import?<incremental>")] +pub async fn r_admin_import_post(ri: RequestInfo, incremental: bool) -> MyResult<Flash<Redirect>> { + ri.session.assert_admin()?; + do_import(&ri.session, incremental).await?; + Ok(Flash::success( + Redirect::to(u_admin_import()), + tr(ri.lang, "admin.import_success"), + )) +} + +#[get("/admin/import", rank = 1)] +pub fn r_admin_import_stream(_session: A<Session>, ws: WebSocket) -> Stream!['static] { + Stream! { ws => + loop { + let Some(p) = IMPORT_PROGRESS.read().await.clone() else { + break; + }; + yield Message::Text(serde_json::to_string(&p).unwrap()); + sleep(Duration::from_secs_f32(0.05)).await; + } + yield Message::Text("done".to_string()); + let _ = ws; + } +} diff --git a/server/src/ui/admin/log.rs b/server/src/ui/admin/log.rs index 24671bb..0a0e5ca 100644 --- a/server/src/ui/admin/log.rs +++ b/server/src/ui/admin/log.rs @@ -4,7 +4,7 @@ Copyright (C) 2025 metamuffin <metamuffin.org> */ use crate::{ - helper::{RequestInfo, A}, + helper::{A, RequestInfo}, ui::error::MyResult, }; use jellylogic::{ @@ -12,7 +12,7 @@ use jellylogic::{ session::Session, }; use jellyui::{ - admin::log::{render_log_line, ServerLogPage}, + admin::log::{ServerLogPage, render_log_line}, render_page, }; use rocket::{get, response::content::RawHtml}; diff --git a/server/src/ui/admin/mod.rs b/server/src/ui/admin/mod.rs index 02a7605..3bd4771 100644 --- a/server/src/ui/admin/mod.rs +++ b/server/src/ui/admin/mod.rs @@ -3,6 +3,7 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin <metamuffin.org> */ +pub mod import; pub mod log; pub mod user; @@ -11,15 +12,15 @@ use crate::helper::RequestInfo; use jellycommon::routes::u_admin_dashboard; use jellyimport::is_importing; use jellylogic::admin::{ - create_invite, delete_invite, do_import, get_import_errors, list_invites, update_search_index, + create_invite, delete_invite, get_import_errors, list_invites, update_search_index, }; use jellyui::{admin::AdminDashboardPage, locale::tr, render_page}; use rocket::{ + FromForm, form::Form, get, post, request::FlashMessage, - response::{content::RawHtml, Flash, Redirect}, - FromForm, + response::{Flash, Redirect, content::RawHtml}, }; #[get("/admin/dashboard")] @@ -76,16 +77,6 @@ pub async fn r_admin_remove_invite( )) } -#[post("/admin/import?<incremental>")] -pub async fn r_admin_import(ri: RequestInfo, incremental: bool) -> MyResult<Flash<Redirect>> { - ri.session.assert_admin()?; - do_import(&ri.session, incremental).await?.1?; - Ok(Flash::success( - Redirect::to(u_admin_dashboard()), - tr(ri.lang, "admin.import_success"), - )) -} - #[post("/admin/update_search")] pub async fn r_admin_update_search(ri: RequestInfo) -> MyResult<Flash<Redirect>> { ri.session.assert_admin()?; |