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;
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}