aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-12-11 01:20:17 +0100
committermetamuffin <metamuffin@disroot.org>2025-12-11 01:20:17 +0100
commit6e5f6d9b9c6fedb4ab80190c156595d321d33bbf (patch)
treeb6c2140e744fc3018ad08975afefad40386ebbc6 /server
parente4f865e9da9d6660399e22a6fbeb5b84a749b07a (diff)
downloadjellything-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.rs14
-rw-r--r--server/src/ui/admin/import.rs70
-rw-r--r--server/src/ui/admin/log.rs4
-rw-r--r--server/src/ui/admin/mod.rs17
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()?;