1
use axum::http::StatusCode;
2
use axum::{Extension, Json, extract::State};
3
use serde::{Deserialize, Serialize};
4
use server::command::{CmdResult, FinanceEntity, commodity::ListCommodities};
5
use std::sync::Arc;
6

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

            
9
#[derive(Deserialize)]
10
pub struct CommoditySearch {
11
    #[serde(rename = "commodity-search")]
12
    query: Option<String>,
13
}
14

            
15
#[derive(Serialize)]
16
pub struct CommodityJson {
17
    id: String,
18
    symbol: String,
19
    name: String,
20
}
21

            
22
1
pub async fn search_commodities(
23
1
    State(_data): State<Arc<AppState>>,
24
1
    Extension(jwt_auth): Extension<JWTAuthMiddleware>,
25
1
    Json(form): Json<CommoditySearch>,
26
1
) -> Result<Json<Vec<CommodityJson>>, StatusCode> {
27
1
    let result = match ListCommodities::new().user_id(jwt_auth.user.id).run().await {
28
        Ok(Some(CmdResult::TaggedEntities { entities, .. })) => entities,
29
1
        _ => return Ok(Json(vec![])),
30
    };
31

            
32
    let mut commodities = Vec::new();
33
    for (entity, tags) in result {
34
        if let FinanceEntity::Commodity(commodity) = entity {
35
            // Find symbol and name tags
36
            let (symbol, name) = if let (FinanceEntity::Tag(s), FinanceEntity::Tag(n)) =
37
                (&tags["symbol"], &tags["name"])
38
            {
39
                (s.tag_value.clone(), n.tag_value.clone())
40
            } else {
41
                continue;
42
            };
43

            
44
            // Filter by search query if provided
45
            if let Some(query) = &form.query {
46
                if query.is_empty()
47
                    || symbol.to_lowercase().contains(&query.to_lowercase())
48
                    || name.to_lowercase().contains(&query.to_lowercase())
49
                {
50
                    commodities.push(CommodityJson {
51
                        id: commodity.id.to_string(),
52
                        symbol,
53
                        name,
54
                    });
55
                }
56
            } else {
57
                commodities.push(CommodityJson {
58
                    id: commodity.id.to_string(),
59
                    symbol,
60
                    name,
61
                });
62
            }
63
        }
64
    }
65

            
66
    Ok(Json(commodities))
67
1
}