"""Proxy RTSport API requests from main server to local API.
Note: Coach Dashboard API endpoints are NOT included here to avoid
routing conflicts with the catch-all /{path:path} proxy route.
They are mounted separately in main_v2.py from rtsport_coach_api.
"""
import httpx
from fastapi import APIRouter, Request, Response
from fastapi.responses import JSONResponse
router = APIRouter()
RTS_API_BASE = "http://127.0.0.1:8001"
async def proxy_request(request: Request, path: str):
"""Forward request to RTSport API."""
async with httpx.AsyncClient() as client:
url = f"{RTS_API_BASE}/api/v1/{path}"
# Forward headers
headers = dict(request.headers)
headers.pop('host', None)
# Get body if present
body = await request.body()
# Forward request
method = request.method
resp = await client.request(
method=method,
url=url,
headers=headers,
content=body,
params=request.query_params,
timeout=30.0
)
return Response(
content=resp.content,
status_code=resp.status_code,
headers=dict(resp.headers)
)
Paths handled locally by coach_api_router and parent_api_router — do NOT proxy
LOCAL_PATHS: set[str] = set()
@router.api_route("/{path:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE"])
async def rtsport_proxy(request: Request, path: str):
return await proxy_request(request, path)