/* 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::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, }; use jellyui::{admin::AdminDashboardPage, locale::tr, render_page}; use rocket::{ form::Form, get, post, request::FlashMessage, response::{content::RawHtml, Flash, Redirect}, FromForm, }; #[get("/admin/dashboard")] pub async fn r_admin_dashboard( ri: RequestInfo, flash: Option>, ) -> MyResult> { ri.session.assert_admin()?; let flash = None; let invites = list_invites(&ri.session)?; let last_import_err = get_import_errors(&ri.session).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: &ri.lang, }, ri.render_info(), ))) } #[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( ri: RequestInfo, form: Form, ) -> MyResult> { 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/import?")] pub async fn r_admin_import(ri: RequestInfo, incremental: bool) -> MyResult> { 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> { 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"), )) }