added refference point

This commit is contained in:
2026-06-25 11:04:21 +03:00
parent cd82244dcd
commit b5258b4f82
23 changed files with 1922 additions and 3 deletions
+138
View File
@@ -81,6 +81,41 @@ class TrackSyncBody(BaseModel):
label: Optional[str] = None
class ReferencePointStartBody(BaseModel):
device_id: str
label: Optional[str] = None
lat: Optional[float] = None
lon: Optional[float] = None
meta: Optional[dict[str, Any]] = None
class ReferencePointSample(BaseModel):
ts: Optional[float] = None
lat: Optional[float] = None
lon: Optional[float] = None
rssi: Optional[float] = None
role: Optional[str] = None
meta: Optional[Any] = None
preset_id: Optional[str] = None
preset_name: Optional[str] = None
params: Optional[dict[str, Any]] = None
class ReferencePointSamplesBody(BaseModel):
samples: list[ReferencePointSample] = Field(default_factory=list)
class MacroPresetBody(BaseModel):
id: Optional[str] = None
name: str
description: Optional[str] = None
params: Optional[dict[str, Any]] = None
lines: Optional[list[str]] = None
scope: Optional[str] = None
device_role: Optional[str] = None
enabled: bool = True
class CommandBody(BaseModel):
from_device_id: str
to_device_id: str
@@ -238,6 +273,109 @@ def tracks_get(track_id: int):
raise HTTPException(404, detail=str(e)) from e
@app.post("/api/reference-points/start")
def reference_points_start(
body: ReferencePointStartBody,
x_lora_client: Optional[str] = Header(None, alias=ANDROID_CLIENT_HEADER),
):
_require_android(x_lora_client)
try:
return storage.start_reference_point_session(
body.device_id, body.label, body.lat, body.lon, body.meta
)
except ValueError as e:
raise HTTPException(400, detail=str(e)) from e
@app.post("/api/reference-points/{session_id}/samples")
def reference_points_samples(
session_id: int,
body: ReferencePointSamplesBody,
x_lora_client: Optional[str] = Header(None, alias=ANDROID_CLIENT_HEADER),
):
_require_android(x_lora_client)
try:
samples = [p.model_dump(exclude_none=True) for p in body.samples]
return storage.add_reference_point_samples(session_id, samples)
except ValueError as e:
raise HTTPException(400, detail=str(e)) from e
@app.post("/api/reference-points/{session_id}/finish")
def reference_points_finish(
session_id: int,
x_lora_client: Optional[str] = Header(None, alias=ANDROID_CLIENT_HEADER),
):
_require_android(x_lora_client)
try:
return storage.finish_reference_point_session(session_id)
except ValueError as e:
raise HTTPException(400, detail=str(e)) from e
@app.get("/api/reference-points")
def reference_points_list(
device_id: Optional[str] = None,
limit: int = Query(50, ge=1, le=200),
):
return storage.list_reference_point_sessions(device_id, limit)
@app.get("/api/reference-points/{session_id}")
def reference_points_get(session_id: int):
try:
return storage.get_reference_point_session(session_id)
except ValueError as e:
raise HTTPException(404, detail=str(e)) from e
@app.get("/api/macro-presets")
def macro_presets_list(include_disabled: bool = False):
return storage.list_macro_presets(include_disabled)
@app.post("/api/macro-presets")
def macro_presets_post(body: MacroPresetBody):
try:
return storage.upsert_macro_preset(
body.id,
body.name,
body.description,
body.params,
body.lines,
body.scope,
body.device_role,
body.enabled,
)
except ValueError as e:
raise HTTPException(400, detail=str(e)) from e
@app.patch("/api/macro-presets/{preset_id}")
def macro_presets_patch(preset_id: str, body: MacroPresetBody):
try:
return storage.upsert_macro_preset(
preset_id,
body.name,
body.description,
body.params,
body.lines,
body.scope,
body.device_role,
body.enabled,
)
except ValueError as e:
raise HTTPException(400, detail=str(e)) from e
@app.delete("/api/macro-presets/{preset_id}")
def macro_presets_delete(preset_id: str):
try:
return storage.delete_macro_preset(preset_id)
except ValueError as e:
raise HTTPException(404, detail=str(e)) from e
def _require_android(x_lora_client: Optional[str]) -> None:
if (x_lora_client or "").strip().lower() != ANDROID_CLIENT_VALUE:
raise HTTPException(