92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
|
|
"""
|
||
|
|
POI Context Proxy Router
|
||
|
|
Forwards all POI context requests to the External Service
|
||
|
|
"""
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Request, HTTPException
|
||
|
|
from fastapi.responses import JSONResponse
|
||
|
|
import httpx
|
||
|
|
import structlog
|
||
|
|
from app.core.config import settings
|
||
|
|
|
||
|
|
logger = structlog.get_logger()
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
|
||
|
|
@router.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"])
|
||
|
|
async def proxy_poi_context(request: Request, path: str):
|
||
|
|
"""
|
||
|
|
Proxies all POI context requests to the External Service.
|
||
|
|
|
||
|
|
Forwards requests from /api/v1/poi-context/* to external-service:8000/api/v1/poi-context/*
|
||
|
|
|
||
|
|
Args:
|
||
|
|
request: The incoming request
|
||
|
|
path: The path after /api/v1/poi-context/
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
JSONResponse with the response from the external service
|
||
|
|
|
||
|
|
Raises:
|
||
|
|
HTTPException: If the external service is unavailable or returns an error
|
||
|
|
"""
|
||
|
|
try:
|
||
|
|
# Construct the external service URL
|
||
|
|
external_url = f"{settings.EXTERNAL_SERVICE_URL}/poi-context/{path}"
|
||
|
|
|
||
|
|
logger.debug("Proxying POI context request",
|
||
|
|
method=request.method,
|
||
|
|
path=path,
|
||
|
|
external_url=external_url)
|
||
|
|
|
||
|
|
# Get request body for POST/PUT/PATCH requests
|
||
|
|
body = None
|
||
|
|
if request.method in ["POST", "PUT", "PATCH"]:
|
||
|
|
body = await request.body()
|
||
|
|
|
||
|
|
# Copy headers (exclude host and content-length as they'll be set by httpx)
|
||
|
|
headers = {
|
||
|
|
key: value
|
||
|
|
for key, value in request.headers.items()
|
||
|
|
if key.lower() not in ["host", "content-length"]
|
||
|
|
}
|
||
|
|
|
||
|
|
# Make the request to the external service
|
||
|
|
async with httpx.AsyncClient(timeout=60.0) as client:
|
||
|
|
response = await client.request(
|
||
|
|
method=request.method,
|
||
|
|
url=external_url,
|
||
|
|
params=request.query_params,
|
||
|
|
headers=headers,
|
||
|
|
content=body
|
||
|
|
)
|
||
|
|
|
||
|
|
logger.debug("POI context proxy response",
|
||
|
|
status_code=response.status_code,
|
||
|
|
path=path)
|
||
|
|
|
||
|
|
# Return the response from the external service
|
||
|
|
return JSONResponse(
|
||
|
|
content=response.json() if response.text else None,
|
||
|
|
status_code=response.status_code,
|
||
|
|
headers=dict(response.headers)
|
||
|
|
)
|
||
|
|
|
||
|
|
except httpx.RequestError as exc:
|
||
|
|
logger.error("External service POI request failed",
|
||
|
|
error=str(exc),
|
||
|
|
path=path,
|
||
|
|
external_url=external_url)
|
||
|
|
raise HTTPException(
|
||
|
|
status_code=503,
|
||
|
|
detail=f"POI service unavailable: {exc}"
|
||
|
|
)
|
||
|
|
except Exception as exc:
|
||
|
|
logger.error("Unexpected error in POI proxy",
|
||
|
|
error=str(exc),
|
||
|
|
path=path)
|
||
|
|
raise HTTPException(
|
||
|
|
status_code=500,
|
||
|
|
detail="Internal server error in POI proxy"
|
||
|
|
)
|