From be4af57d75cc1e233b4714b18198fb7bde49464d Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 16 Feb 2026 17:50:57 +0100 Subject: refactor ui responder; add admin import pages --- server/src/ui/admin/import.rs | 89 ++++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 34 deletions(-) (limited to 'server/src/ui/admin/import.rs') diff --git a/server/src/ui/admin/import.rs b/server/src/ui/admin/import.rs index 79b8374..984966b 100644 --- a/server/src/ui/admin/import.rs +++ b/server/src/ui/admin/import.rs @@ -4,44 +4,62 @@ Copyright (C) 2026 metamuffin */ -use crate::{request_info::RequestInfo, ui::error::MyResult}; -use jellycommon::routes::u_admin_import; +use crate::{request_info::RequestInfo, ui::error::MyResult, ui_responder::UiResponse}; +use jellycommon::{ + ADMIN_IMPORT_BUSY, ADMIN_IMPORT_ERROR, VIEW_ADMIN_IMPORT, + jellyobject::{Object, ObjectBuffer}, + routes::u_admin_import, +}; use jellyimport::{ - is_importing, + ImportConfig, import_wrap, is_importing, reporting::{IMPORT_ERRORS, IMPORT_PROGRESS}, }; +use jellyui::tr; use rocket::{ get, post, - request::FlashMessage, - response::{Flash, Redirect, content::RawHtml}, + response::{Flash, Redirect}, }; use rocket_ws::{Message, Stream, WebSocket}; use std::time::Duration; -use tokio::time::sleep; +use tokio::{spawn, time::sleep}; #[get("/admin/import", rank = 2)] -pub async fn r_admin_import( - ri: RequestInfo, - flash: Option>, -) -> MyResult> { - ri.session.assert_admin()?; +pub async fn r_admin_import(ri: RequestInfo<'_>) -> MyResult { + ri.require_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(), - ))) + let last_import_err = last_import_err + .iter() + .map(|e| e.as_str()) + .collect::>(); + let mut data = ObjectBuffer::empty(); + + if is_importing() { + data = data.as_object().insert(ADMIN_IMPORT_BUSY, ()); + } + data = data + .as_object() + .insert_multi(ADMIN_IMPORT_ERROR, &last_import_err); + + Ok(ri.respond_ui(Object::EMPTY.insert(VIEW_ADMIN_IMPORT, data.as_object()))) } #[post("/admin/import?")] -pub async fn r_admin_import_post(ri: RequestInfo, incremental: bool) -> MyResult> { - ri.session.assert_admin()?; - do_import(&ri.session, incremental).await?; +pub async fn r_admin_import_post( + ri: RequestInfo<'_>, + incremental: bool, +) -> MyResult> { + ri.require_admin()?; + spawn(async move { + let _ = import_wrap( + ImportConfig { + cache: ri.state.cache.clone(), + db: ri.state.database.clone(), + }, + incremental, + ) + .await; + }); Ok(Flash::success( Redirect::to(u_admin_import()), tr(ri.lang, "admin.import_success"), @@ -49,16 +67,19 @@ pub async fn r_admin_import_post(ri: RequestInfo, incremental: bool) -> MyResult } #[get("/admin/import", rank = 1)] -pub fn r_admin_import_stream(_session: A, 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; +pub fn r_admin_import_stream(ri: RequestInfo<'_>, ws: WebSocket) -> MyResult { + ri.require_admin()?; + Ok({ + 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; } - yield Message::Text("done".to_string()); - let _ = ws; - } + }) } -- cgit v1.3