From c742e0b84d1389fa0639894b0e8ab8086f45543f Mon Sep 17 00:00:00 2001 From: pollutri Date: Tue, 17 Feb 2026 17:07:19 +0100 Subject: [PATCH] api metadati v1 --- .env | 1 + app.py | 58 +++++++++++++++++++++++++++++++++++++++++++++ config_env.py | 5 ++++ schemas/reslevis.py | 11 +++++++++ 4 files changed, 75 insertions(+) diff --git a/.env b/.env index 71f73f5..e613c33 100644 --- a/.env +++ b/.env @@ -16,3 +16,4 @@ KEYCLOAK_TOKEN_URL=${KEYCLOAK_PROTOCOL_ENDPOINT}/token #BLE AI infer CSV BLE_AI_INFER_CSV=/data/service/ble-ai-localizer/data/infer/infer.csv +BLE_AI_META_DIR=/data/service/ble-ai-localizer/data/infer diff --git a/app.py b/app.py index b68be9d..5420233 100644 --- a/app.py +++ b/app.py @@ -9,6 +9,7 @@ from typing import Any, Dict, List, Optional # import wave import os import shutil +import re # import enviroment variables import config_env #other @@ -41,6 +42,7 @@ from models.cellular_hardwares import cellularHardwares from models.call import call, post_call from models.calls import calls from models.httpresponse import httpResponse400, httpResponse200, httpResponse500 +from schemas.reslevis import CalibrationMetadata from fastapi_login import LoginManager @@ -192,6 +194,23 @@ app.include_router(majornet_router) app.include_router(contacts_router) app.include_router(reslevis_router, prefix="/reslevis", tags=["Reslevis"]) +META_FILE_PATTERN = re.compile(r"^meta_(-?\d+)\.json$") + +def _model_to_dict(model: Any) -> Dict[str, Any]: + if hasattr(model, "model_dump"): + return model.model_dump() + return model.dict() + +def _validate_metadata(payload: Dict[str, Any]) -> Dict[str, Any]: + if hasattr(CalibrationMetadata, "model_validate"): + return _model_to_dict(CalibrationMetadata.model_validate(payload)) + return _model_to_dict(CalibrationMetadata.parse_obj(payload)) + +def _read_ble_ai_metadata(path: str) -> Dict[str, Any]: + with open(path) as f: + payload = json.load(f) + return _validate_metadata(payload) + @app.get("/") async def root(): @@ -239,6 +258,45 @@ async def get_ble_ai_infer(mac: Optional[List[str]] = Query(default=None)): return {"items": items, "count": len(items)} +@app.get("/ble-ai/metadata", tags=["BLE-AI"], dependencies=[Depends(get_current_user)]) +async def get_ble_ai_metadata(floor: Optional[int] = Query(default=None)): + meta_dir = config_env.BLE_AI_META_DIR + if not os.path.isdir(meta_dir): + raise HTTPException(status_code=404, detail="Metadata directory not found") + + if floor is not None: + file_path = os.path.join(meta_dir, f"meta_{floor}.json") + if not os.path.isfile(file_path): + raise HTTPException(status_code=404, detail="Metadata file not found") + try: + metadata = _read_ble_ai_metadata(file_path) + except Exception: + log.exception("Invalid metadata file: %s", file_path) + raise HTTPException(status_code=500, detail="Invalid metadata file") + return {"floor": floor, "metadata": metadata} + + items = [] + for file_name in os.listdir(meta_dir): + match = META_FILE_PATTERN.match(file_name) + if not match: + continue + + file_floor = int(match.group(1)) + file_path = os.path.join(meta_dir, file_name) + if not os.path.isfile(file_path): + continue + + try: + metadata = _read_ble_ai_metadata(file_path) + except Exception: + log.exception("Invalid metadata file: %s", file_path) + raise HTTPException(status_code=500, detail="Invalid metadata file") + items.append({"floor": file_floor, "metadata": metadata}) + + items.sort(key=lambda item: item["floor"]) + return {"items": items, "count": len(items)} + + @app.get("/openapi.json/", tags=["Documentation"]) async def get_open_api_endpoint(): #async def get_open_api_endpoint(current_user: User = Depends(get_current_active_user)): diff --git a/config_env.py b/config_env.py index 4f69128..673d9d2 100644 --- a/config_env.py +++ b/config_env.py @@ -27,3 +27,8 @@ BLE_AI_INFER_CSV = os.getenv( "/data/service/ble-ai-localizer/data/infer/infer.csv", ) +BLE_AI_META_DIR = os.getenv( + "BLE_AI_META_DIR", + "/data/service/ble-ai-localizer/data/infer", +) + diff --git a/schemas/reslevis.py b/schemas/reslevis.py index e4328d6..05da507 100644 --- a/schemas/reslevis.py +++ b/schemas/reslevis.py @@ -3,6 +3,7 @@ from typing import Optional from uuid import UUID from typing import Optional, Union from typing import List +from typing import Tuple class BuildingItem(BaseModel): id: UUID @@ -137,3 +138,13 @@ class ConfigItem(BaseModel): propery: List[str] offset: str +class CalibrationMetadata(BaseModel): + pixel_ratio: float + calibrated: bool + origin: Tuple[int, int] + grid_size: int + +#??? Da verificate ??? +class DownloadFileImmage(): + name : str + immage_path : str \ No newline at end of file