i18n+filtering fork - fluent-templates v2
at main 55 lines 1.6 kB view raw
1use anyhow::Result; 2use axum::{ 3 extract::{Query, State}, 4 response::IntoResponse, 5}; 6use axum_extra::extract::Cached; 7use minijinja::context as template_context; 8use serde::Deserialize; 9 10use crate::{ 11 contextual_error, create_renderer, 12 http::{ 13 context::WebContext, errors::WebError, middleware_auth::Auth, middleware_i18n::Language, 14 }, 15 storage::event::rsvp_get, 16}; 17 18#[derive(Deserialize)] 19pub struct RsvpRecordQuery { 20 pub aturi: String, 21} 22 23pub async fn handle_admin_rsvp( 24 State(web_context): State<WebContext>, 25 Language(language): Language, 26 Cached(auth): Cached<Auth>, 27 Query(query): Query<RsvpRecordQuery>, 28) -> Result<impl IntoResponse, WebError> { 29 let current_handle = auth.require_admin(&web_context.config)?; 30 31 let canonical_url = format!("https://{}/admin/rsvp", web_context.config.external_base); 32 33 // Create the template renderer with enhanced context 34 let renderer = create_renderer!(web_context.clone(), Language(language), false, false); 35 36 // Fetch the RSVP 37 let rsvp_result = rsvp_get(&web_context.pool, &query.aturi).await; 38 if let Err(err) = rsvp_result { 39 return contextual_error!(renderer: renderer, err, template_context!{ aturi => query.aturi.clone() }); 40 } 41 let rsvp = rsvp_result.unwrap(); 42 43 // Convert the RSVP to a JSON string for display 44 let rsvp_json = serde_json::to_string_pretty(&rsvp).unwrap_or_default(); 45 46 Ok(renderer.render_template( 47 "admin_rsvp", 48 template_context! { 49 rsvp, 50 rsvp_json, 51 }, 52 Some(&current_handle), 53 &canonical_url, 54 )) 55}