1
use axum::{Extension, Json, extract::Query, http::StatusCode};
2
use serde::Deserialize;
3

            
4
use crate::jwt_auth::JWTAuthMiddleware;
5

            
6
pub async fn transaction_tag_names(
7
    Extension(jwt_auth): Extension<JWTAuthMiddleware>,
8
) -> Result<Json<Vec<String>>, (StatusCode, Json<serde_json::Value>)> {
9
    let user = &jwt_auth.user;
10
    let server_user = server::user::User { id: user.id };
11

            
12
    match server_user.list_transaction_tag_names().await {
13
        Ok(names) => Ok(Json(names)),
14
        Err(e) => {
15
            let error_response = serde_json::json!({
16
                "status": "fail",
17
                "message": "Failed to fetch transaction tag names",
18
            });
19
            log::error!("Failed to fetch transaction tag names: {e:?}");
20
            Err((StatusCode::INTERNAL_SERVER_ERROR, Json(error_response)))
21
        }
22
    }
23
}
24

            
25
#[derive(Deserialize)]
26
pub struct TagValuesQuery {
27
    name: String,
28
}
29

            
30
pub async fn transaction_tag_values(
31
    Query(query): Query<TagValuesQuery>,
32
    Extension(jwt_auth): Extension<JWTAuthMiddleware>,
33
) -> Result<Json<Vec<String>>, (StatusCode, Json<serde_json::Value>)> {
34
    let user = &jwt_auth.user;
35
    let server_user = server::user::User { id: user.id };
36

            
37
    match server_user.list_transaction_tag_values(&query.name).await {
38
        Ok(values) => Ok(Json(values)),
39
        Err(e) => {
40
            let error_response = serde_json::json!({
41
                "status": "fail",
42
                "message": "Failed to fetch transaction tag values",
43
            });
44
            log::error!(
45
                "Failed to fetch transaction tag values for '{}': {e:?}",
46
                query.name
47
            );
48
            Err((StatusCode::INTERNAL_SERVER_ERROR, Json(error_response)))
49
        }
50
    }
51
}
52

            
53
pub async fn split_tag_names(
54
    Extension(jwt_auth): Extension<JWTAuthMiddleware>,
55
) -> Result<Json<Vec<String>>, (StatusCode, Json<serde_json::Value>)> {
56
    let user = &jwt_auth.user;
57
    let server_user = server::user::User { id: user.id };
58

            
59
    match server_user.list_split_tag_names().await {
60
        Ok(names) => Ok(Json(names)),
61
        Err(e) => {
62
            let error_response = serde_json::json!({
63
                "status": "fail",
64
                "message": "Failed to fetch split tag names",
65
            });
66
            log::error!("Failed to fetch split tag names: {e:?}");
67
            Err((StatusCode::INTERNAL_SERVER_ERROR, Json(error_response)))
68
        }
69
    }
70
}
71

            
72
pub async fn split_tag_values(
73
    Query(query): Query<TagValuesQuery>,
74
    Extension(jwt_auth): Extension<JWTAuthMiddleware>,
75
) -> Result<Json<Vec<String>>, (StatusCode, Json<serde_json::Value>)> {
76
    let user = &jwt_auth.user;
77
    let server_user = server::user::User { id: user.id };
78

            
79
    match server_user.list_split_tag_values(&query.name).await {
80
        Ok(values) => Ok(Json(values)),
81
        Err(e) => {
82
            let error_response = serde_json::json!({
83
                "status": "fail",
84
                "message": "Failed to fetch split tag values",
85
            });
86
            log::error!(
87
                "Failed to fetch split tag values for '{}': {e:?}",
88
                query.name
89
            );
90
            Err((StatusCode::INTERNAL_SERVER_ERROR, Json(error_response)))
91
        }
92
    }
93
}