from typing import Any, Dict, List, Optional from fastapi import APIRouter, Depends, HTTPException, Query, Request from app.engine import DuckDBEngine from app.models import EntityPutRequest router = APIRouter(tags=["Entities"]) def get_engine(request: Request) -> DuckDBEngine: return request.app.state.engine @router.post("/entities") async def put_entity( req: EntityPutRequest, engine: DuckDBEngine = Depends(get_engine), ) -> Dict[str, Any]: try: return engine.put_entity(req) except ValueError as ve: raise HTTPException(status_code=400, detail=str(ve)) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/entities/{collection}") async def list_entities( collection: str, engine: DuckDBEngine = Depends(get_engine), ) -> List[Dict[str, Any]]: try: return engine.list_entities(collection=collection) except ValueError as ve: raise HTTPException(status_code=400, detail=str(ve)) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/places/near") async def find_places_near( lat: float = Query(..., description="Latitude"), lon: float = Query(..., description="Longitude"), radius_m: float = Query(default=1000.0, description="Radius in meters"), category: Optional[str] = Query(default=None, description="Category filter"), engine: DuckDBEngine = Depends(get_engine), ) -> List[Dict[str, Any]]: try: return engine.find_places_near(lat=lat, lon=lon, radius_m=radius_m, category=category) except Exception as e: raise HTTPException(status_code=500, detail=str(e))