forked from
smokesignal.events/smokesignal
Fork i18n + search + filtering- v0.2
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}