1
use std::sync::Arc;
2

            
3
use askama::Template;
4
use axum::{Extension, Json, extract::State, http::StatusCode, response::IntoResponse};
5
use serde::Deserialize;
6

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

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

            
13
pub async fn commodity_create_page() -> impl IntoResponse {
14
    let template = CommodityCreatePage {};
15
    HtmlTemplate(template)
16
}
17

            
18
#[derive(Template)]
19
#[template(path = "components/commodity/create.html")]
20
struct CommodityFormTemplate;
21

            
22
pub async fn commodity_form() -> impl IntoResponse {
23
    let template = CommodityFormTemplate {};
24
    HtmlTemplate(template)
25
}
26

            
27
#[derive(Deserialize)]
28
pub struct CommodityForm {
29
    fraction: String,
30
    symbol: String,
31
    name: String,
32
}
33

            
34
8
pub async fn commodity_submit(
35
8
    State(_data): State<Arc<AppState>>,
36
8
    Extension(jwt_auth): Extension<JWTAuthMiddleware>,
37
8
    Json(form): Json<CommodityForm>,
38
12
) -> Result<impl IntoResponse, (StatusCode, Json<serde_json::Value>)> {
39
8
    let user = &jwt_auth.user;
40

            
41
    // Parse the fraction with proper error handling
42
8
    let fraction_value = if let Ok(val) = form.fraction.parse::<i64>() {
43
6
        val
44
    } else {
45
2
        let error_response = serde_json::json!({
46
2
            "status": "fail",
47
2
            "message":                t!("Provide the correct fraction value"),
48
        });
49
2
        return Err((StatusCode::BAD_REQUEST, Json(error_response)));
50
    };
51

            
52
    // Execute command
53
6
    match server::command::commodity::CreateCommodity::new()
54
6
        .fraction(fraction_value.into())
55
6
        .symbol(form.symbol)
56
6
        .name(form.name)
57
6
        .user_id(user.id)
58
6
        .run()
59
6
        .await
60
    {
61
        Ok(result) => match result {
62
            Some(id) => Ok(format!("{}: {}", t!("New commodity id"), id)),
63
            None => Ok("New commodity created".to_string()),
64
        },
65
6
        Err(e) => {
66
6
            let error_response = serde_json::json!({
67
6
                "status": "fail",
68
6
                "message": t!("Failed to create commodity"),
69
            });
70

            
71
6
            log::error!("Failed to create commodity: {e:?}");
72
6
            Err((StatusCode::INTERNAL_SERVER_ERROR, Json(error_response)))
73
        }
74
    }
75
8
}