i18n+filtering fork - fluent-templates v2
at main 69 lines 2.0 kB view raw
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}