| @@ -1,5 +1,6 @@ | |||
| import asyncio | |||
| import json | |||
| import logging | |||
| from fastapi import APIRouter, Depends, HTTPException, Query, Request | |||
| import httpx | |||
| import config_env | |||
| @@ -37,7 +38,9 @@ from security import get_current_user | |||
| #CORE SYNC | |||
| CORE_BASE_URL = config_env.CORE_API_URL.rstrip("/") | |||
| TRACKS_CORE_BASE_URL = "http://localhost:1902" | |||
| CORE_TIMEOUT = 2.0 # secondi | |||
| logger = logging.getLogger("reslevis") | |||
| async def sync_core_get(request: Request) -> None: | |||
| if request.method != "GET": | |||
| @@ -177,15 +180,17 @@ async def _core_get_json_via_curl( | |||
| params: Optional[dict] = None, | |||
| ): | |||
| query_string = urlencode(params or {}) | |||
| url = f"{CORE_BASE_URL}{path}" | |||
| url = f"{TRACKS_CORE_BASE_URL}{path}" | |||
| if query_string: | |||
| url = f"{url}?{query_string}" | |||
| cmd = ["curl", "-sS", "-X", "GET"] | |||
| if CORE_BASE_URL.startswith("https://"): | |||
| if TRACKS_CORE_BASE_URL.startswith("https://"): | |||
| cmd.append("-k") | |||
| cmd.append(url) | |||
| logger.warning("tracks curl url=%s", url) | |||
| process = await asyncio.create_subprocess_exec( | |||
| *cmd, | |||
| stdout=asyncio.subprocess.PIPE, | |||
| @@ -195,11 +200,16 @@ async def _core_get_json_via_curl( | |||
| if process.returncode != 0: | |||
| detail = (stderr or stdout).decode("utf-8", errors="replace").strip() or "CORE curl request failed" | |||
| logger.error("tracks curl failed url=%s detail=%s", url, detail) | |||
| raise HTTPException(status_code=502, detail=detail) | |||
| preview = stdout.decode("utf-8", errors="replace") | |||
| logger.warning("tracks curl response url=%s preview=%s", url, preview[:500]) | |||
| try: | |||
| return json.loads(stdout.decode("utf-8")) | |||
| return json.loads(preview) | |||
| except ValueError as exc: | |||
| logger.error("tracks curl invalid json url=%s", url) | |||
| raise HTTPException(status_code=502, detail="Invalid CORE response") from exc | |||
| @@ -207,10 +217,13 @@ async def _fetch_tracks_for_tracker( | |||
| tracker_id: str, | |||
| params: Optional[dict] = None, | |||
| ) -> List[dict]: | |||
| logger.warning("tracks fetch tracker_id=%s params=%s", tracker_id, params) | |||
| payload = await _core_get_json_via_curl(f"/reslevis/getTracks/{tracker_id}", params=params) | |||
| if not isinstance(payload, list): | |||
| raise HTTPException(status_code=502, detail="Unexpected CORE response type") | |||
| return [_normalize_track(row) for row in payload if isinstance(row, dict)] | |||
| rows = [_normalize_track(row) for row in payload if isinstance(row, dict)] | |||
| logger.warning("tracks fetch tracker_id=%s rows=%s", tracker_id, len(rows)) | |||
| return rows | |||
| def _sort_tracks_desc(rows: List[dict]) -> List[dict]: | |||
| @@ -243,6 +256,21 @@ async def _fetch_all_tracks(params: dict) -> List[dict]: | |||
| return merged | |||
| async def _fetch_first_tracker_tracks(params: dict) -> List[dict]: | |||
| trackers_payload = await _core_get_json_via_curl("/reslevis/getTrackers") | |||
| if not isinstance(trackers_payload, list): | |||
| raise HTTPException(status_code=502, detail="Unexpected CORE tracker response type") | |||
| for item in trackers_payload: | |||
| if not isinstance(item, dict): | |||
| continue | |||
| tracker_id = item.get("id") | |||
| if tracker_id: | |||
| return await _fetch_tracks_for_tracker(str(tracker_id), params) | |||
| return [] | |||
| @router.get( | |||
| "/getGateways", | |||
| response_model=List[GatewayItem], | |||
| @@ -435,7 +463,7 @@ async def getTracks( | |||
| if selected_tracker_id: | |||
| return await _fetch_tracks_for_tracker(selected_tracker_id, params) | |||
| return await _fetch_all_tracks(params) | |||
| return await _fetch_first_tracker_tracks(params) | |||
| @router.get( | |||