use anyhow::Result; use axum::{extract::Query, response::IntoResponse}; use axum_template::RenderHtml; use minijinja::context as template_context; use serde::Serialize; use crate::{ contextual_error, http::{ context::{AdminRequestContext, admin_template_context}, errors::WebError, pagination::{Pagination, PaginationView}, }, select_template, storage::private_event_content::private_event_content_list, }; #[derive(Serialize)] struct ContentListItem { aturi: String, criteria_count: usize, content_preview: String, created_at: String, } pub(crate) async fn handle_admin_content_list( admin_ctx: AdminRequestContext, pagination: Query, ) -> Result { let canonical_url = format!( "https://{}/admin/content", admin_ctx.web_context.config.external_base ); let default_context = admin_template_context(&admin_ctx, &canonical_url, "content"); let language = admin_ctx.language; let web_context = admin_ctx.web_context; let render_template = select_template!("admin_content_list", false, false, language); let error_template = select_template!(false, false, language); let (page, page_size) = pagination.admin_clamped(); let content = private_event_content_list(&web_context.pool, page, page_size).await; if let Err(err) = content { return contextual_error!( web_context, language.0, error_template, default_context, err ); } let (total_count, mut content) = content.unwrap(); let params: Vec<(&str, &str)> = vec![]; let pagination_view = PaginationView::new(page_size, content.len() as i64, page, params); if content.len() > page_size as usize { content.truncate(page_size as usize); } // Transform content to a simpler structure for the template let content_items: Vec = content .iter() .map(|item| ContentListItem { aturi: item.aturi.clone(), criteria_count: item.display_criteria.0.len(), content_preview: if item.content.len() > 50 { format!("{}...", &item.content[..50]) } else { item.content.clone() }, created_at: item.created_at.to_rfc3339(), }) .collect(); Ok(RenderHtml( &render_template, web_context.engine.clone(), template_context! { ..default_context, ..template_context! { content => content_items, total_count => total_count, pagination => pagination_view, }}, ) .into_response()) }