use std::sync::Arc;
use axum::{
extract::Path, extract::Query, extract::State, response::IntoResponse, routing::get, Json,
Router,
};
use serde::Deserialize;
use uuid::Uuid;
use crate::application::service::hierarchy_service::HierarchyService;
use crate::domain::repositories::hierarchy_repository::HierarchyTable;
fn err(e: anyhow::Error) -> (axum::http::StatusCode, Json<serde_json::Value>) {
(
axum::http::StatusCode::INTERNAL_SERVER_ERROR,
Json(serde_json::json!({ "success": false, "error": e.to_string() })),
)
}
async fn ancestors(
State(svc): State<Arc<HierarchyService>>,
table: HierarchyTable,
Path(id): Path<Uuid>,
) -> impl IntoResponse {
match svc.ancestors(table, id).await {
Ok(chain) => {
Json(serde_json::json!({ "success": true, "hierarchy": chain })).into_response()
}
Err(e) => err(e).into_response(),
}
}
pub fn create_hierarchy_routes(service: Arc<HierarchyService>) -> Router {
Router::new()
.route(
"/accounts/:id/hierarchy",
get(|st, id| ancestors(st, HierarchyTable::Account, id)),
)
.route(
"/cost-centers/:id/hierarchy",
get(|st, id| ancestors(st, HierarchyTable::CostCenter, id)),
)
.route(
"/fiscal-periods/:id/hierarchy",
get(|st, id| ancestors(st, HierarchyTable::FiscalPeriod, id)),
)
.with_state(service)
}