//! nested `/api` //! //! Route handler for `/api` routes. //! //! | Handler | Route | //! | - | - | //! | [`auth::register`] | POST `/api/register` | //! | [`auth::login`] | POST `/api/login` | //! | [`auth::logout`] | POST `/api/logout` | //! | [`stats`] | GET `/api/stats/now/{name}` | mod auth; use axum::{ Router, body::Body, extract::{Path, State}, response::Response, routing::{get, post}, }; use sessionhash::RequestContext; use crate::{RuntimeError, fs, state::SplormState}; /// Routes nested under /api pub fn routes() -> Router { Router::new() .route("/auth/register", post(auth::register)) .route("/auth/login", post(auth::login)) .route("/auth/logout", post(auth::logout)) .route("/stats/now/{name}", get(stats)) } /// GET /api/stats/now/{name} async fn stats( Path(name): Path, State(state): State, ctx: RequestContext, ) -> Result { tracing::trace!("{ctx} GET /api/stats/{name}"); let graphs = { let mut connector = state.gatherer_thread().await; connector.regular_graphs().await } .map_err(|_| RuntimeError::Unknown)?; let file_path = match name.as_str() { "current_hostmeminfo.gif" => graphs.meminfo, "current_hostnetinfo.gif" => graphs.netinfo, "current_hostcpuinfo.gif" => graphs.cpuinfo, _ => return Err(RuntimeError::generic_404()), }; tracing::trace!("graph {name} system_path={file_path}"); let file = fs::unsafe_read_file(file_path).await?; Response::builder() .header("content-type", "image/gif") .status(200) .body(Body::from(file)) .map_err(|_| RuntimeError::Unknown) }