workout-tracker / tracker /backup_api.py
ronheichman's picture
Deploy workout tracker
b28b9ac verified
Raw
History Blame Contribute Delete
1.42 kB
"""Authenticated download of a consistent SQLite snapshot of tracker.db (HF backup before redeploy)."""
from __future__ import annotations
import sqlite3
import tempfile
from pathlib import Path
from fastapi import APIRouter, HTTPException, Request
from fastapi.responses import FileResponse
from starlette.background import BackgroundTask
router = APIRouter(prefix="/api/admin", tags=["admin"])
def snapshot_tracker_db_to_temp_file(source: Path) -> Path:
"""Copy the open database to a new file using SQLite backup API (WAL-safe snapshot)."""
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".db")
tmp_path = Path(tmp.name)
tmp.close()
dest_conn = sqlite3.connect(str(tmp_path))
src_conn = sqlite3.connect(str(source))
src_conn.backup(dest_conn)
dest_conn.close()
src_conn.close()
return tmp_path
@router.get("/tracker-db")
def download_tracker_db(request: Request) -> FileResponse:
cfg = request.app.state.tracker_config
source = cfg.tracker_db_full_path
if not source.is_file():
raise HTTPException(
status_code=503,
detail=f"Tracker database not found at {source}",
)
tmp_path = snapshot_tracker_db_to_temp_file(source)
return FileResponse(
path=str(tmp_path),
filename="tracker.db",
media_type="application/x-sqlite3",
background=BackgroundTask(tmp_path.unlink),
)