use std::sync::Arc; use axum::{ extract::{Query, State}, Json, }; use serde::Deserialize; use crate::models::{Catalog, CatalogObject}; use crate::store::CatalogStore; pub async fn list_catalogs(State(state): State>) -> Json> { Json(state.catalogs.clone()) } #[derive(Debug, Deserialize)] pub struct ObjectQuery { catalog: Option, #[serde(default)] limit: Option, } pub async fn list_objects( State(state): State>, Query(query): Query, ) -> Json> { let limit = query.limit.unwrap_or(100).min(10_000); tracing::debug!( %limit, catalog = query.catalog.as_deref().unwrap_or("all"), objects = state.objects.len(), "querying catalog objects" ); let objects: Vec = match &query.catalog { Some(catalog) => state .objects .iter() .filter(|o| &o.catalog == catalog) .take(limit) .cloned() .collect(), None => state.objects.iter().take(limit).cloned().collect(), }; Json(objects) }