1
use askama::Template;
2
use axum::{Extension, extract::State, http::StatusCode, response::IntoResponse};
3
use serde::Serialize;
4
use std::sync::Arc;
5
use uuid::Uuid;
6

            
7
use crate::{AppState, jwt_auth::JWTAuthMiddleware, pages::HtmlTemplate};
8

            
9
#[derive(Template)]
10
#[template(path = "pages/template/list.html")]
11
struct TemplateListPage;
12

            
13
pub async fn template_list_page() -> impl IntoResponse {
14
    HtmlTemplate(TemplateListPage {})
15
}
16

            
17
#[derive(Serialize)]
18
struct TemplateData {
19
    id: Uuid,
20
    name: Option<String>,
21
    size: i32,
22
}
23

            
24
#[derive(Template)]
25
#[template(path = "components/template/table.html")]
26
struct TemplateTableTemplate {
27
    templates: Vec<TemplateData>,
28
}
29

            
30
pub 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
}