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::{
9 context::AdminRequestContext,
10 errors::WebError,
11 pagination::{Pagination, PaginationView},
12 },
13 storage::event::rsvp_list,
14};
15
16#[derive(Deserialize, Default)]
17pub struct AdminRsvpsParams {
18 #[serde(flatten)]
19 pagination: Pagination,
20
21 #[serde(default)]
22 import_success: bool,
23 imported_aturi: Option<String>,
24}
25
26pub async fn handle_admin_rsvps(
27 admin_ctx: AdminRequestContext,
28 Query(params): Query<AdminRsvpsParams>,
29) -> Result<impl IntoResponse, WebError> {
30 let language = admin_ctx.language;
31 let web_context = admin_ctx.web_context;
32
33 let import_success = params.import_success;
34 let imported_aturi = params.imported_aturi;
35
36 let canonical_url = format!("https://{}/admin/rsvps", web_context.config.external_base);
37
38 // Create the template renderer with enhanced context
39 let renderer = create_renderer!(web_context.clone(), language, false, false);
40
41 let (page, page_size) = params.pagination.admin_clamped();
42
43 let rsvps = rsvp_list(&web_context.pool, page, page_size).await;
44 if let Err(err) = rsvps {
45 return contextual_error!(renderer: renderer, err, template_context!{});
46 }
47 let (total_count, mut rsvps) = rsvps.unwrap();
48
49 let params: Vec<(&str, &str)> = vec![];
50
51 let pagination_view = PaginationView::new(page_size, rsvps.len() as i64, page, params);
52
53 if rsvps.len() > page_size as usize {
54 rsvps.truncate(page_size as usize);
55 }
56
57 Ok(renderer.render_template(
58 "admin_rsvps",
59 template_context! {
60 import_success => import_success,
61 imported_aturi => imported_aturi,
62 rsvps => rsvps,
63 total_count => total_count,
64 pagination => pagination_view,
65 },
66 Some(&admin_ctx.admin_handle),
67 &canonical_url,
68 ))
69}