use anyhow::Result; use axum::{ extract::{Query, State}, response::IntoResponse, }; use axum_extra::extract::Cached; use minijinja::context as template_context; use serde::Deserialize; use crate::{ contextual_error, create_renderer, http::{ context::WebContext, errors::WebError, middleware_auth::Auth, middleware_i18n::Language, }, storage::event::rsvp_get, }; #[derive(Deserialize)] pub struct RsvpRecordQuery { pub aturi: String, } pub async fn handle_admin_rsvp( State(web_context): State, Language(language): Language, Cached(auth): Cached, Query(query): Query, ) -> Result { let current_handle = auth.require_admin(&web_context.config)?; let canonical_url = format!("https://{}/admin/rsvp", web_context.config.external_base); // Create the template renderer with enhanced context let renderer = create_renderer!(web_context.clone(), Language(language), false, false); // Fetch the RSVP let rsvp_result = rsvp_get(&web_context.pool, &query.aturi).await; if let Err(err) = rsvp_result { return contextual_error!(renderer: renderer, err, template_context!{ aturi => query.aturi.clone() }); } let rsvp = rsvp_result.unwrap(); // Convert the RSVP to a JSON string for display let rsvp_json = serde_json::to_string_pretty(&rsvp).unwrap_or_default(); Ok(renderer.render_template( "admin_rsvp", template_context! { rsvp, rsvp_json, }, Some(¤t_handle), &canonical_url, )) }