Browse Source

api metadati v1

api_metadati
Lorenzo Pollutri 1 month ago
parent
commit
c742e0b84d
4 changed files with 75 additions and 0 deletions
  1. +1
    -0
      .env
  2. +58
    -0
      app.py
  3. +5
    -0
      config_env.py
  4. +11
    -0
      schemas/reslevis.py

+ 1
- 0
.env View File

@@ -16,3 +16,4 @@ KEYCLOAK_TOKEN_URL=${KEYCLOAK_PROTOCOL_ENDPOINT}/token


#BLE AI infer CSV #BLE AI infer CSV
BLE_AI_INFER_CSV=/data/service/ble-ai-localizer/data/infer/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

+ 58
- 0
app.py View File

@@ -9,6 +9,7 @@ from typing import Any, Dict, List, Optional
# import wave # import wave
import os import os
import shutil import shutil
import re
# import enviroment variables # import enviroment variables
import config_env import config_env
#other #other
@@ -41,6 +42,7 @@ from models.cellular_hardwares import cellularHardwares
from models.call import call, post_call from models.call import call, post_call
from models.calls import calls from models.calls import calls
from models.httpresponse import httpResponse400, httpResponse200, httpResponse500 from models.httpresponse import httpResponse400, httpResponse200, httpResponse500
from schemas.reslevis import CalibrationMetadata


from fastapi_login import LoginManager from fastapi_login import LoginManager


@@ -192,6 +194,23 @@ app.include_router(majornet_router)
app.include_router(contacts_router) app.include_router(contacts_router)
app.include_router(reslevis_router, prefix="/reslevis", tags=["Reslevis"]) 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("/") @app.get("/")
async def root(): 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)} 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"]) @app.get("/openapi.json/", tags=["Documentation"])
async def get_open_api_endpoint(): async def get_open_api_endpoint():
#async def get_open_api_endpoint(current_user: User = Depends(get_current_active_user)): #async def get_open_api_endpoint(current_user: User = Depends(get_current_active_user)):


+ 5
- 0
config_env.py View File

@@ -27,3 +27,8 @@ BLE_AI_INFER_CSV = os.getenv(
"/data/service/ble-ai-localizer/data/infer/infer.csv", "/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",
)


+ 11
- 0
schemas/reslevis.py View File

@@ -3,6 +3,7 @@ from typing import Optional
from uuid import UUID from uuid import UUID
from typing import Optional, Union from typing import Optional, Union
from typing import List from typing import List
from typing import Tuple


class BuildingItem(BaseModel): class BuildingItem(BaseModel):
id: UUID id: UUID
@@ -137,3 +138,13 @@ class ConfigItem(BaseModel):
propery: List[str] propery: List[str]
offset: 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

Loading…
Cancel
Save