""" Utgående, lesende HTTP-klient mot teeoff sitt offentlige facilities-API (ADR-004/ADR-019). Ren HTTP-modul -- ingen db/RLS-avhengighet, samme isolasjonsprinsipp som handicap_engine.py. Server-til-server: teecup_api snakker med teeoff_api direkte over det delte Docker-nettverket (teeoff_default), ikke via Caddy/det offentlige domenet. Endepunktene (`/api/facilities`, `/api/facilities/{slug}`) er offentlige i teeoff -- ingen auth-mekanisme finnes der, så ingen hemmelighet trengs her. """ import httpx from .config import settings _TIMEOUT = httpx.Timeout(10.0, connect=5.0) class TeeoffUnavailableError(Exception): """Teeoff svarte ikke (nede, timeout, uventet statuskode).""" class TeeoffNotFoundError(Exception): """Anlegget finnes ikke i teeoff (404).""" async def search_facilities(query: str) -> list[dict]: """`?view=search` gir en lettvekts liste (id/slug/name/city/county/...) egnet for søk -- filtrerer på navn her, teeoff har ingen egen søkeparameter på dette endepunktet.""" url = f"{settings.TEEOFF_API_BASE_URL}/api/facilities" try: async with httpx.AsyncClient(timeout=_TIMEOUT) as client: res = await client.get(url, params={"view": "search"}) except httpx.HTTPError as e: raise TeeoffUnavailableError(str(e)) from e if res.status_code != 200: raise TeeoffUnavailableError(f"uventet status {res.status_code}") facilities: list[dict] = res.json() q = query.strip().lower() if not q: return facilities return [f for f in facilities if q in (f.get("name") or "").lower()] async def get_facility(slug: str) -> dict: url = f"{settings.TEEOFF_API_BASE_URL}/api/facilities/{slug}" try: async with httpx.AsyncClient(timeout=_TIMEOUT) as client: res = await client.get(url) except httpx.HTTPError as e: raise TeeoffUnavailableError(str(e)) from e if res.status_code == 404: raise TeeoffNotFoundError(slug) if res.status_code != 200: raise TeeoffUnavailableError(f"uventet status {res.status_code}") return res.json()