generated from Grigo/AndroidTemplate
offline track
This commit is contained in:
@@ -353,6 +353,79 @@ def finish_track(track_id: int) -> dict[str, Any]:
|
||||
return {"ok": True, "track_id": track_id, "ended_at": ts, "point_count": count}
|
||||
|
||||
|
||||
def sync_track(
|
||||
device_id: str,
|
||||
points: list[dict[str, Any]],
|
||||
track_id: Optional[int] = None,
|
||||
started_at: Optional[float] = None,
|
||||
finish: bool = False,
|
||||
label: Optional[str] = None,
|
||||
) -> dict[str, Any]:
|
||||
"""Upload buffered points after offline recording; optionally create track and finish."""
|
||||
if not is_valid_device_id(device_id):
|
||||
raise ValueError(f"invalid device_id '{device_id}'")
|
||||
points = points or []
|
||||
|
||||
if track_id is not None:
|
||||
with _db() as conn:
|
||||
track = conn.execute(
|
||||
"SELECT id, device_id, ended_at FROM tracks WHERE id = ?",
|
||||
(track_id,),
|
||||
).fetchone()
|
||||
if not track:
|
||||
raise ValueError(f"track {track_id} not found")
|
||||
if track["device_id"] != device_id:
|
||||
raise ValueError("device_id does not match track owner")
|
||||
if track["ended_at"] is not None:
|
||||
raise ValueError(f"track {track_id} already finished")
|
||||
else:
|
||||
if not points and not finish:
|
||||
raise ValueError("points required when creating a new track")
|
||||
ts = float(started_at) if started_at is not None else time.time()
|
||||
with _db() as conn:
|
||||
cur = conn.execute(
|
||||
"""
|
||||
INSERT INTO tracks (device_id, started_at, label)
|
||||
VALUES (?, ?, ?)
|
||||
""",
|
||||
(device_id, ts, label),
|
||||
)
|
||||
track_id = int(cur.lastrowid)
|
||||
|
||||
added = 0
|
||||
batch_size = 100
|
||||
for i in range(0, len(points), batch_size):
|
||||
chunk = points[i : i + batch_size]
|
||||
if not chunk:
|
||||
continue
|
||||
result = add_track_points(track_id, chunk)
|
||||
added += int(result.get("added") or 0)
|
||||
|
||||
finished = False
|
||||
ended_at = None
|
||||
point_count = added
|
||||
if finish:
|
||||
fin = finish_track(track_id)
|
||||
finished = True
|
||||
ended_at = fin.get("ended_at")
|
||||
point_count = int(fin.get("point_count") or 0)
|
||||
else:
|
||||
with _db() as conn:
|
||||
point_count = conn.execute(
|
||||
"SELECT COUNT(*) FROM track_points WHERE track_id = ?",
|
||||
(track_id,),
|
||||
).fetchone()[0]
|
||||
|
||||
return {
|
||||
"ok": True,
|
||||
"track_id": track_id,
|
||||
"added": added,
|
||||
"point_count": point_count,
|
||||
"finished": finished,
|
||||
"ended_at": ended_at,
|
||||
}
|
||||
|
||||
|
||||
def list_tracks(device_id: Optional[str] = None, limit: int = 50) -> list[dict[str, Any]]:
|
||||
limit = min(max(1, limit), 200)
|
||||
with _db() as conn:
|
||||
|
||||
Reference in New Issue
Block a user