Просмотр исходного кода

Track API bug fix 5

auth_API_bug_fix
Lorenzo Pollutri 1 месяц назад
Родитель
Сommit
c094396dbc
1 измененных файлов: 33 добавлений и 5 удалений
  1. +33
    -5
      routes/reslevis.py

+ 33
- 5
routes/reslevis.py Просмотреть файл

@@ -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(


Загрузка…
Отмена
Сохранить