""" api_client.py — HTTP-клиент для stats-приложения. Запросы идут к основному API без авторизации. """ import os from typing import Optional import httpx API_URL = os.getenv("API_URL", "http://api:8000") _TIMEOUT = 15 async def get_summary() -> dict: try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/summary") if resp.status_code == 200: return resp.json() except Exception: pass return {"total_responses": 0, "total_polls": 0, "active_polls": 0, "orgs_active": 0} async def get_years() -> list[int]: try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/years") if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_chart_data( group_by: str, poll_id: Optional[str] = None, org_id: Optional[str] = None, group_id: Optional[str] = None, year: Optional[int] = None, ) -> list[dict]: params: dict = {"group_by": group_by} if poll_id: params["poll_id"] = poll_id if org_id: params["org_id"] = org_id if group_id: params["group_id"] = group_id if year: params["year"] = year try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/responses", params=params) if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_polls() -> list[dict]: try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/polls/") if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_organizations() -> list[dict]: try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/organizations/") if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_groups() -> list[dict]: try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/groups/") if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_dimensions(poll_id: Optional[str] = None) -> list[str]: params = {} if poll_id: params["poll_id"] = poll_id try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/results/dimensions", params=params) if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_avg_by_dimension( poll_id: Optional[str] = None, org_id: Optional[str] = None, group_id: Optional[str] = None, year: Optional[int] = None, ) -> list[dict]: params = {} if poll_id: params["poll_id"] = poll_id if org_id: params["org_id"] = org_id if group_id: params["group_id"] = group_id if year: params["year"] = year try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/results/avg-by-dimension", params=params) if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_leading_type( poll_id: Optional[str] = None, org_id: Optional[str] = None, group_id: Optional[str] = None, year: Optional[int] = None, ) -> list[dict]: params = {} if poll_id: params["poll_id"] = poll_id if org_id: params["org_id"] = org_id if group_id: params["group_id"] = group_id if year: params["year"] = year try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/results/leading-type", params=params) if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_compare_groups( dimension_name: str, by: str = "organization", poll_id: Optional[str] = None, year: Optional[int] = None, ) -> list[dict]: params = {"dimension_name": dimension_name, "by": by} if poll_id: params["poll_id"] = poll_id if year: params["year"] = year try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/results/compare-groups", params=params) if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_top_users( dimension_name: str, poll_id: Optional[str] = None, org_id: Optional[str] = None, group_id: Optional[str] = None, year: Optional[int] = None, limit: int = 10, ) -> list[dict]: params = {"dimension_name": dimension_name, "limit": limit} if poll_id: params["poll_id"] = poll_id if org_id: params["org_id"] = org_id if group_id: params["group_id"] = group_id if year: params["year"] = year try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/results/top-users", params=params) if resp.status_code == 200: return resp.json() except Exception: pass return [] async def get_dimension_trend( dimension_name: str, poll_id: Optional[str] = None, org_id: Optional[str] = None, group_id: Optional[str] = None, ) -> list[dict]: params = {"dimension_name": dimension_name} if poll_id: params["poll_id"] = poll_id if org_id: params["org_id"] = org_id if group_id: params["group_id"] = group_id try: async with httpx.AsyncClient(base_url=API_URL, timeout=_TIMEOUT) as client: resp = await client.get("/stats/results/dimension-trend", params=params) if resp.status_code == 200: return resp.json() except Exception: pass return []