forked from
smokesignal.events/smokesignal
i18n+filtering fork - fluent-templates v2
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(¤t_handle),
53 &canonical_url,
54 ))
55}