aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/admin
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/ui/admin')
-rw-r--r--server/src/ui/admin/import.rs89
-rw-r--r--server/src/ui/admin/mod.rs78
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, &())])))
}