/* 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 */ use crate::{ helper::{language::AcceptLanguage, A}, ui::error::MyResult, }; use jellyimport::is_importing; use jellylogic::{ admin::log::{get_log_buffer, get_log_stream}, session::Session, }; use jellyui::{ admin::log::{render_log_line, ServerLogPage}, render_page, scaffold::{RenderInfo, SessionInfo}, }; use rocket::{get, response::content::RawHtml}; use rocket_ws::{Message, Stream, WebSocket}; use serde_json::json; #[get("/admin/log?", rank = 2)] pub fn r_admin_log<'a>( session: A, warnonly: bool, lang: AcceptLanguage, ) -> MyResult> { session.0.assert_admin()?; let AcceptLanguage(lang) = lang; let messages = get_log_buffer(warnonly) .into_iter() .map(|l| render_log_line(&l)) .collect::>(); Ok(RawHtml(render_page( &ServerLogPage { messages: &messages, warnonly, }, RenderInfo { importing: is_importing(), session: Some(SessionInfo { user: session.0.user, }), }, lang, ))) } #[get("/admin/log?stream&&", rank = 1)] pub fn r_admin_log_stream( session: A, ws: WebSocket, warnonly: bool, html: bool, ) -> Stream!['static] { // TODO type problems let ok = session.0.assert_admin().is_ok(); let mut stream = get_log_stream(warnonly); Stream! { ws => if !ok { yield Message::Text("unauthorized".to_string()); } else if html { let _ = ws; while let Ok(line) = stream.recv().await { yield Message::Text(render_log_line(&line)); } } else { let _ = ws; while let Ok(line) = stream.recv().await { yield Message::Text(json!(line).to_string()); } } } }