"""Client HTTP verso l'api-service (service-to-service via x-api-key). Espone accesso a: /jobs ciclo di vita job /queue stato coda /pageconnections registro sessioni di pagina (enforcement /test max 2) """ from __future__ import annotations from typing import Any, Optional import httpx from core.config import settings def _headers() -> dict: return {"x-api-key": settings.internal_api_key, "Content-Type": "application/json"} async def _req(method: str, path: str, json: Optional[dict] = None, params: Optional[dict] = None) -> Any: url = f"{settings.api_url}{path}" async with httpx.AsyncClient(timeout=10.0) as c: r = await c.request(method, url, json=json, params=params, headers=_headers()) r.raise_for_status() if r.status_code == 204 or not r.content: return None return r.json() # ── jobs ──────────────────────────────────────────────────────────────────── async def create_job(type_: str, created_by: str, payload: dict) -> dict: return await _req("POST", "/jobs", json={"type": type_, "created_by": created_by, "payload": payload}) async def update_job(job_id: str, **fields) -> dict: return await _req("PATCH", f"/jobs/{job_id}", json=fields) async def get_job(job_id: str) -> dict: return await _req("GET", f"/jobs/{job_id}") async def list_jobs(type_: Optional[str] = None, status: Optional[str] = None, limit: int = 50) -> list: params = {"limit": str(limit)} if type_: params["type"] = type_ if status: params["status"] = status return await _req("GET", "/jobs", params=params) or [] # ── queue ─────────────────────────────────────────────────────────────────── async def queue_status(type_: str = "train") -> dict: return await _req("GET", "/queue", params={"type": type_}) # ── page connections ─────────────────────────────────────────────────────── async def page_connect(page: str, user_id: str, session_id: str) -> dict: return await _req("POST", "/pageconnections", json={"page": page, "user_id": user_id, "session_id": session_id}) async def page_ping(session_id: str) -> dict: return await _req("POST", f"/pageconnections/{session_id}/ping") async def page_disconnect(session_id: str) -> None: await _req("DELETE", f"/pageconnections/{session_id}") async def page_count(page: str) -> dict: return await _req("GET", f"/pageconnections/{page}")