diff options
Diffstat (limited to 'server/src/ui/admin')
| -rw-r--r-- | server/src/ui/admin/import.rs | 89 | ||||
| -rw-r--r-- | server/src/ui/admin/mod.rs | 78 |
2 files changed, 62 insertions, 105 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; - } + }) } diff --git a/server/src/ui/admin/mod.rs b/server/src/ui/admin/mod.rs index 5ee05b7..61e62a4 100644 --- a/server/src/ui/admin/mod.rs +++ b/server/src/ui/admin/mod.rs @@ -3,80 +3,16 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin <metamuffin.org> */ + pub mod import; -pub mod log; -pub mod user; use super::error::MyResult; -use crate::request_info::RequestInfo; -use jellycommon::routes::u_admin_dashboard; -use jellyimport::is_importing; -use rocket::{ - FromForm, - form::Form, - get, post, - request::FlashMessage, - response::{Flash, Redirect, content::RawHtml}, -}; +use crate::{request_info::RequestInfo, ui_responder::UiResponse}; +use jellycommon::{VIEW_ADMIN_DASHBOARD, jellyobject::ObjectBuffer}; +use rocket::get; #[get("/admin/dashboard")] -pub async fn r_admin_dashboard( - ri: RequestInfo, - flash: Option<FlashMessage<'_>>, -) -> MyResult<RawHtml<String>> { - ri.session.assert_admin()?; - let invites = list_invites(&ri.session)?; - - let busy = if is_importing() { - Some("An import is currently running.") - } else { - None - }; - - Ok(RawHtml(render_page( - &AdminDashboardPage { - busy, - invites: &invites, - flash: &flash.map(FlashMessage::into_inner), - lang: &ri.lang, - }, - ri.render_info(), - ))) -} - -#[post("/admin/generate_invite")] -pub async fn r_admin_invite(ri: RequestInfo) -> MyResult<Flash<Redirect>> { - let i = create_invite(&ri.session)?; - Ok(Flash::success( - Redirect::to(u_admin_dashboard()), - tr(ri.lang, "admin.invite_create_success").replace("{invite}", &i), - )) -} - -#[derive(FromForm)] -pub struct DeleteInvite { - invite: String, -} - -#[post("/admin/remove_invite", data = "<form>")] -pub async fn r_admin_remove_invite( - ri: RequestInfo, - form: Form<DeleteInvite>, -) -> MyResult<Flash<Redirect>> { - ri.session.assert_admin()?; - delete_invite(&ri.session, &form.invite)?; - Ok(Flash::success( - Redirect::to(u_admin_dashboard()), - tr(ri.lang, "admin.invite_delete_success"), - )) -} - -#[post("/admin/update_search")] -pub async fn r_admin_update_search(ri: RequestInfo) -> MyResult<Flash<Redirect>> { - ri.session.assert_admin()?; - update_search_index(&ri.session).await?; - Ok(Flash::success( - Redirect::to(u_admin_dashboard()), - tr(ri.lang, "admin.update_search_success"), - )) +pub async fn r_admin_dashboard(ri: RequestInfo<'_>) -> MyResult<UiResponse> { + ri.require_admin()?; + Ok(ri.respond_ui(ObjectBuffer::new(&mut [(VIEW_ADMIN_DASHBOARD.0, &())]))) } |