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