i18n+filtering fork - fluent-templates v2
at main 53 lines 1.6 kB view raw
1use anyhow::Result; 2use axum::{extract::Query, response::IntoResponse}; 3use minijinja::context as template_context; 4 5use crate::{ 6 contextual_error, create_renderer, 7 http::{ 8 context::AdminRequestContext, 9 errors::WebError, 10 pagination::{Pagination, PaginationView}, 11 }, 12 storage::event::event_list, 13}; 14 15pub async fn handle_admin_events( 16 admin_ctx: AdminRequestContext, 17 pagination: Query<Pagination>, 18) -> Result<impl IntoResponse, WebError> { 19 let language = admin_ctx.language; 20 let web_context = admin_ctx.web_context; 21 22 let canonical_url = format!("https://{}/admin/events", web_context.config.external_base); 23 24 // Create the template renderer with enhanced context 25 let renderer = create_renderer!(web_context.clone(), language, false, false); 26 27 let (page, page_size) = pagination.admin_clamped(); 28 29 let events = event_list(&web_context.pool, page, page_size).await; 30 if let Err(err) = events { 31 return contextual_error!(renderer: renderer, err, template_context!{}); 32 } 33 let (total_count, mut events) = events.unwrap(); 34 35 let params: Vec<(&str, &str)> = vec![]; 36 37 let pagination_view = PaginationView::new(page_size, events.len() as i64, page, params); 38 39 if events.len() > page_size as usize { 40 events.truncate(page_size as usize); 41 } 42 43 Ok(renderer.render_template( 44 "admin_events", 45 template_context! { 46 events => events, 47 total_count => total_count, 48 pagination => pagination_view, 49 }, 50 Some(&admin_ctx.admin_handle), 51 &canonical_url, 52 )) 53}