forked from
smokesignal.events/smokesignal
i18n+filtering fork - fluent-templates v2
1use anyhow::Result;
2use axum::{extract::Query, response::IntoResponse};
3use minijinja::context as template_context;
4use serde::Deserialize;
5
6use crate::{
7 contextual_error, create_renderer,
8 http::{context::AdminRequestContext, errors::WebError},
9 storage::event::event_get,
10};
11
12#[derive(Deserialize)]
13pub struct EventRecordQuery {
14 pub aturi: String,
15}
16
17pub async fn handle_admin_event(
18 admin_ctx: AdminRequestContext,
19 Query(query): Query<EventRecordQuery>,
20) -> Result<impl IntoResponse, WebError> {
21 let language = admin_ctx.language;
22 let web_context = admin_ctx.web_context;
23
24 let canonical_url = format!("https://{}/admin/event", web_context.config.external_base);
25
26 // Create the template renderer with enhanced context
27 let renderer = create_renderer!(web_context.clone(), language, false, false);
28
29 // Get the event record by AT-URI
30 let event = event_get(&web_context.pool, &query.aturi).await;
31 if let Err(err) = event {
32 return contextual_error!(renderer: renderer, err, template_context!{ aturi => query.aturi.clone() });
33 }
34 let event = event.unwrap();
35
36 // Also provide the full event object as JSON
37 let event_json = serde_json::to_string_pretty(&event)
38 .unwrap_or_else(|_| "Error formatting JSON".to_string());
39
40 Ok(renderer.render_template(
41 "admin_event",
42 template_context! {
43 aturi => query.aturi.clone(),
44 event => event,
45 event_json => event_json,
46 },
47 Some(&admin_ctx.admin_handle),
48 &canonical_url,
49 ))
50}