Skip to main content

web/pages/template/
list.rs

1use askama::Template;
2use axum::{Extension, extract::State, http::StatusCode, response::IntoResponse};
3use serde::Serialize;
4use std::sync::Arc;
5use uuid::Uuid;
6
7use crate::{AppState, jwt_auth::JWTAuthMiddleware, pages::HtmlTemplate};
8
9#[derive(Template)]
10#[template(path = "pages/template/list.html")]
11struct TemplateListPage;
12
13pub async fn template_list_page() -> impl IntoResponse {
14    HtmlTemplate(TemplateListPage {})
15}
16
17#[derive(Serialize)]
18struct TemplateData {
19    id: Uuid,
20    name: Option<String>,
21    size: i32,
22}
23
24#[derive(Template)]
25#[template(path = "components/template/table.html")]
26struct TemplateTableTemplate {
27    templates: Vec<TemplateData>,
28}
29
30pub async fn template_table(
31    State(_data): State<Arc<AppState>>,
32    Extension(jwt_auth): Extension<JWTAuthMiddleware>,
33) -> Result<impl IntoResponse, (StatusCode, String)> {
34    let user = &jwt_auth.user;
35    let server_user = server::user::User { id: user.id };
36
37    let templates = server_user.list_templates().await.map_err(|e| {
38        (
39            StatusCode::INTERNAL_SERVER_ERROR,
40            format!("DB error: {e:?}"),
41        )
42    })?;
43
44    let template_data: Vec<TemplateData> = templates
45        .into_iter()
46        .map(|t| TemplateData {
47            id: t.id,
48            name: t.name,
49            size: t.size,
50        })
51        .collect();
52
53    Ok(HtmlTemplate(TemplateTableTemplate {
54        templates: template_data,
55    }))
56}