"""Klient HTTP do warstwy logicznej. Jedyny punkt styku prezentacji w dół. Przekazuje dane z formularza i odbiera opracowane wyniki. Prezentacja nie sięga bezpośrednio do bazy ani do silnika. """ from __future__ import annotations from typing import Any import httpx from app.config import settings class LogicClient: def __init__(self, base_url: str | None = None) -> None: self.base_url = (base_url or settings.logic_url).rstrip("/") def query(self, query: str, field: str, exact: bool, limit: int) -> dict[str, Any]: payload = {"query": query, "field": field, "exact": exact, "limit": limit} with httpx.Client(timeout=settings.http_timeout) as client: r = client.post(f"{self.base_url}/api/query", json=payload) r.raise_for_status() return r.json() def positions( self, when_utc_iso: str, lat: float, lon: float, objects: list[str] | None = None ) -> dict[str, Any]: """Pozycje obiektów dla danego momentu — woła logic /chart/positions.""" payload = {"when_utc": when_utc_iso, "lat": lat, "lon": lon, "objects": objects} with httpx.Client(timeout=settings.http_timeout) as client: r = client.post(f"{self.base_url}/chart/positions", json=payload) r.raise_for_status() return r.json()