52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
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))
|