/* 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 */ pub mod log; pub mod user; use super::error::MyResult; use crate::helper::{language::AcceptLanguage, RequestInfo, A}; 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, }, session::Session, }; use jellyui::{ admin::AdminDashboardPage, locale::tr, render_page, scaffold::{RenderInfo, SessionInfo}, }; use rocket::{ form::Form, get, post, response::{content::RawHtml, Flash, Redirect}, FromForm, }; #[get("/admin/dashboard")] pub async fn r_admin_dashboard( session: A, lang: AcceptLanguage, ) -> MyResult> { session.0.assert_admin()?; let AcceptLanguage(lang) = lang; let flash = None; let invites = list_invites(&session.0)?; let last_import_err = get_import_errors(&session.0).await; let busy = if is_importing() { Some("An import is currently running.") } else { None }; Ok(RawHtml(render_page( &AdminDashboardPage { busy, last_import_err: &last_import_err, invites: &invites, flash, lang: &lang, }, RenderInfo { importing: is_importing(), session: Some(SessionInfo { user: session.0.user, }), }, lang, ))) } #[post("/admin/generate_invite")] pub async fn r_admin_invite(ri: RequestInfo) -> MyResult> { 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 = "
")] pub async fn r_admin_remove_invite( session: A, form: Form, ) -> MyResult { session.0.assert_admin()?; delete_invite(&session.0, &form.invite)?; Ok(Redirect::temporary(u_admin_dashboard())) } #[post("/admin/import?")] pub async fn r_admin_import(session: A, incremental: bool) -> MyResult { session.0.assert_admin()?; do_import(&session.0, incremental).await?.1?; Ok(Redirect::temporary(u_admin_dashboard())) } #[post("/admin/update_search")] pub async fn r_admin_update_search(session: A) -> MyResult { session.0.assert_admin()?; update_search_index(&session.0).await?; Ok(Redirect::temporary(u_admin_dashboard())) }