Fork i18n + search + filtering- v0.2
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 120 lines 3.5 kB view raw
1use anyhow::Result; 2use axum::{ 3 extract::{Path, Query}, 4 response::{IntoResponse, Redirect}, 5}; 6use axum_htmx::{HxRedirect, HxRequest}; 7use axum_template::RenderHtml; 8use http::StatusCode; 9use minijinja::context as template_context; 10 11use crate::{ 12 contextual_error, 13 http::{ 14 context::{admin_template_context, AdminRequestContext}, 15 errors::WebError, 16 pagination::{Pagination, PaginationView}, 17 }, 18 select_template, 19 storage::handle::{handle_list, handle_nuke}, 20}; 21 22pub async fn handle_admin_handles( 23 admin_ctx: AdminRequestContext, 24 pagination: Query<Pagination>, 25) -> Result<impl IntoResponse, WebError> { 26 let canonical_url = format!( 27 "https://{}/admin/handles", 28 admin_ctx.web_context.config.external_base 29 ); 30 let default_context = admin_template_context(&admin_ctx, &canonical_url); 31 32 let render_template = select_template!("admin_handles", false, false, admin_ctx.language); 33 let error_template = select_template!(false, false, admin_ctx.language); 34 35 let (page, page_size) = pagination.admin_clamped(); 36 37 let handles = handle_list(&admin_ctx.web_context.pool, page, page_size).await; 38 if let Err(err) = handles { 39 return contextual_error!( 40 admin_ctx.web_context, 41 admin_ctx.language, 42 error_template, 43 default_context, 44 err 45 ); 46 } 47 let (total_count, mut handles) = handles.unwrap(); 48 49 let params: Vec<(&str, &str)> = vec![]; 50 51 let pagination_view = PaginationView::new(page_size, handles.len() as i64, page, params); 52 53 if handles.len() > page_size as usize { 54 handles.truncate(page_size as usize); 55 } 56 57 Ok(RenderHtml( 58 &render_template, 59 admin_ctx.web_context.engine.clone(), 60 template_context! { ..default_context, ..template_context! { 61 handles, 62 total_count, 63 pagination => pagination_view, 64 }}, 65 ) 66 .into_response()) 67} 68 69pub async fn handle_admin_nuke_identity( 70 admin_ctx: AdminRequestContext, 71 HxRequest(hx_request): HxRequest, 72 Path(did): Path<String>, 73) -> Result<impl IntoResponse, WebError> { 74 let error_template = select_template!(false, false, admin_ctx.language); 75 76 if did == admin_ctx.admin_handle.did { 77 return contextual_error!( 78 admin_ctx.web_context, 79 admin_ctx.language, 80 error_template, 81 template_context! { 82 message => "You cannot nuke your own identity." 83 }, 84 "You cannot nuke your own identity." 85 ); 86 } 87 88 if let Err(err) = handle_nuke( 89 &admin_ctx.web_context.pool, 90 &did, 91 &admin_ctx.admin_handle.did, 92 ) 93 .await 94 { 95 return contextual_error!( 96 admin_ctx.web_context, 97 admin_ctx.language, 98 error_template, 99 template_context! {}, 100 err 101 ); 102 } 103 104 if hx_request { 105 let hx_redirect = HxRedirect::try_from("/admin/handles"); 106 if let Err(err) = hx_redirect { 107 return contextual_error!( 108 admin_ctx.web_context, 109 admin_ctx.language, 110 error_template, 111 template_context! {}, 112 err 113 ); 114 } 115 let hx_redirect = hx_redirect.unwrap(); 116 Ok((StatusCode::OK, hx_redirect, "").into_response()) 117 } else { 118 Ok(Redirect::to("/admin/handles").into_response()) 119 } 120}