diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-16 17:50:57 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-16 17:50:57 +0100 |
| commit | be4af57d75cc1e233b4714b18198fb7bde49464d (patch) | |
| tree | 6e529e748fc1d5c212dcf8033c8158630ca4f4d6 /server/src/ui/admin/import.rs | |
| parent | bb1822e3e68fe6f699102bfc1659731bdbac1a40 (diff) | |
| download | jellything-be4af57d75cc1e233b4714b18198fb7bde49464d.tar jellything-be4af57d75cc1e233b4714b18198fb7bde49464d.tar.bz2 jellything-be4af57d75cc1e233b4714b18198fb7bde49464d.tar.zst | |
refactor ui responder; add admin import pages
Diffstat (limited to 'server/src/ui/admin/import.rs')
| -rw-r--r-- | server/src/ui/admin/import.rs | 89 |
1 files changed, 55 insertions, 34 deletions
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 <metamuffin.org> */ -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<FlashMessage<'_>>, -) -> MyResult<RawHtml<String>> { - ri.session.assert_admin()?; +pub async fn r_admin_import(ri: RequestInfo<'_>) -> MyResult<UiResponse> { + 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::<Vec<_>>(); + 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?<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?; +pub async fn r_admin_import_post( + ri: RequestInfo<'_>, + incremental: bool, +) -> MyResult<Flash<Redirect>> { + 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<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; +pub fn r_admin_import_stream(ri: RequestInfo<'_>, ws: WebSocket) -> MyResult<Stream!['static]> { + 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; - } + }) } |