use crate::db; use crate::server::AppState; use super::GalleryState; use super::Media; use super::render::{RenderResult, ServerError, TemplatedResponse}; use askama::Template; use axum::extract::{Path, Query, State}; use axum::{Router, routing::get}; use serde::Deserialize; use uuid::Uuid; #[derive(Template)] #[template(path = "web/preview/preview.html")] struct HxRoot<'a> { slideshow: bool, features: &'a crate::server::Features, prev: Option, media: Option, next: Option, } #[derive(Deserialize, Default, Debug, Clone)] pub(super) struct PreviewState { slideshow: Option, } async fn root( State(app_state): State, Query(state): Query, Query(preview): Query, Path(uuid): Path, ) -> RenderResult { let pool = &app_state.pool; let config = &app_state.config; let res = db::media_get(pool, &state, &state, &uuid) .await .map_err(ServerError::DB)?; HxRoot { slideshow: preview.slideshow.unwrap_or_default(), features: &config.features, prev: res.0.map(|m| (m, &config.pathfinder).into()), media: res.1.map(|m| (m, &config.pathfinder).into()), next: res.2.map(|m| (m, &config.pathfinder).into()), } .render_response() } pub fn create_router() -> Router { Router::new().route("/{idx}", get(root)) }