"keep data on the server" opt-in/out

This commit is contained in:
Davide Scaini
2026-04-10 13:01:21 +02:00
parent 5170afa9e8
commit 469a5954cc
6 changed files with 77 additions and 15 deletions
+18 -3
View File
@@ -15,7 +15,7 @@ import time
from pathlib import Path
from typing import Any, Optional
from fastapi import Cookie, FastAPI, File, HTTPException, Request, Response, UploadFile
from fastapi import Cookie, FastAPI, File, Form, HTTPException, Request, Response, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
from fastapi.responses import JSONResponse
@@ -164,10 +164,12 @@ async def me(bincio_session: Optional[str] = Cookie(default=None)) -> JSONRespon
user = _current_user(bincio_session)
if not user:
raise HTTPException(404, "Not authenticated")
store_orig = get_setting(_get_db(), "store_originals")
return JSONResponse({
"handle": user.handle,
"display_name": user.display_name,
"is_admin": user.is_admin,
"store_originals_default": store_orig != "false",
})
@@ -466,6 +468,7 @@ _SUPPORTED_SUFFIXES = {".fit", ".gpx", ".tcx", ".fit.gz", ".gpx.gz", ".tcx.gz"}
@app.post("/api/upload")
async def upload_activity(
files: list[UploadFile] = File(...),
store_original: bool = Form(False),
bincio_session: Optional[str] = Cookie(default=None),
) -> JSONResponse:
from bincio.extract.ingest import ingest_parsed
@@ -496,6 +499,7 @@ async def upload_activity(
staged = staging / name
staged.write_bytes(contents)
kept = False
try:
activity = parse_file(staged)
activity_id = make_activity_id(activity)
@@ -503,12 +507,18 @@ async def upload_activity(
results.append({"name": name, "ok": False, "error": "duplicate"})
continue
ingest_parsed(activity, dd, privacy="public")
if store_original:
originals_dir = dd / "originals"
originals_dir.mkdir(exist_ok=True)
staged.rename(originals_dir / name)
kept = True
results.append({"name": name, "ok": True, "id": activity_id})
any_added = True
except Exception as exc:
results.append({"name": name, "ok": False, "error": f"{type(exc).__name__}: {exc}"})
finally:
staged.unlink(missing_ok=True)
if not kept:
staged.unlink(missing_ok=True)
if any_added:
merge_all(dd)
@@ -524,9 +534,14 @@ async def serve_strava_sync(bincio_session: Optional[str] = Cookie(default=None)
if not strava_client_id or not strava_client_secret:
raise HTTPException(400, "Strava not configured on this server")
dd = _get_data_dir() / user.handle
store_orig_setting = get_setting(_get_db(), "store_originals")
store_orig = store_orig_setting == "true"
originals_dir = (dd / "originals" / "strava") if store_orig else None
if originals_dir:
originals_dir.mkdir(parents=True, exist_ok=True)
from bincio.edit.ops import run_strava_sync
try:
result = run_strava_sync(dd, strava_client_id, strava_client_secret)
result = run_strava_sync(dd, strava_client_id, strava_client_secret, originals_dir=originals_dir)
except RuntimeError as e:
raise HTTPException(502, str(e))
_trigger_rebuild(user.handle)