AkurAI Build
Menu

Public repository / 09c53f7c3446bfebf51992ed343ebf89fd0a6e9f

AkurAI-CRM / crates/crm-api/src/handlers/meta.rs

Latest change d7881502b38897a157bd49340f35ea33e81cbaa7 - feat: initial AkurAI-CRM implementation by Ólafur B. J.

use crate::router_setup::{json_response, CrmState};
use akurai_http::{Request, Response};
use akurai_json::Value;
use std::sync::{Arc, Mutex};

pub fn meta_route(state: Arc<Mutex<CrmState>>) -> Box<dyn Fn(&Request) -> Response + Send + Sync> {
    Box::new(move |_req: &Request| {
        let state = state.lock().unwrap();
        let objects: Vec<Value> = state.objects.iter().map(|obj| {
            let fields: Vec<Value> = obj.fields.iter().map(|f| {
                Value::Object(vec![
                    ("id".into(), Value::Int(f.id as i64)),
                    ("name".into(), Value::Str(f.name.clone())),
                    ("label".into(), Value::Str(f.label.clone())),
                    ("type".into(), Value::Str(format!("{:?}", f.field_type).to_lowercase())),
                    ("required".into(), Value::Bool(f.is_required)),
                    ("unique".into(), Value::Bool(f.is_unique)),
                    ("description".into(), Value::Str(f.description.clone().unwrap_or_default())),
                ])
            }).collect();

            Value::Object(vec![
                ("id".into(), Value::Int(obj.id as i64)),
                ("nameSingular".into(), Value::Str(obj.name_singular.clone())),
                ("namePlural".into(), Value::Str(obj.name_plural.clone())),
                ("labelSingular".into(), Value::Str(obj.label_singular.clone())),
                ("labelPlural".into(), Value::Str(obj.label_plural.clone())),
                ("description".into(), Value::Str(obj.description.clone().unwrap_or_default())),
                ("icon".into(), Value::Str(obj.icon.clone().unwrap_or_default())),
                ("isCustom".into(), Value::Bool(obj.is_custom)),
                ("isSearchable".into(), Value::Bool(obj.is_searchable)),
                ("fields".into(), Value::Array(fields)),
            ])
        }).collect();

        json_response(Value::Object(vec![
            ("version".into(), Value::Str("0.1.0".into())),
            ("objects".into(), Value::Array(objects)),
        ]))
    })
}