"keep data on the server" opt-in/out
This commit is contained in:
@@ -24,7 +24,7 @@ def init(data_dir: str, handle: str, password: str, display_name: str, name: str
|
||||
Creates the SQLite database, the admin user, the per-user data directory,
|
||||
and prints a first invite code. Safe to re-run — skips steps already done.
|
||||
"""
|
||||
from bincio.serve.db import create_invite, create_user, get_user, open_db, set_setting
|
||||
from bincio.serve.db import create_invite, create_user, get_user, open_db, set_setting, get_setting
|
||||
|
||||
dd = Path(data_dir).expanduser().resolve()
|
||||
dd.mkdir(parents=True, exist_ok=True)
|
||||
@@ -75,6 +75,11 @@ def init(data_dir: str, handle: str, password: str, display_name: str, name: str
|
||||
else:
|
||||
console.print(" [dim]·[/dim] no user limit (unlimited)")
|
||||
|
||||
# ── Original file storage default ─────────────────────────────────────────
|
||||
if get_setting(db, "store_originals") is None:
|
||||
set_setting(db, "store_originals", "true")
|
||||
console.print(" [green]✓[/green] store_originals = true (users can override per upload)")
|
||||
|
||||
# ── First invite code ─────────────────────────────────────────────────────
|
||||
code = create_invite(db, handle)
|
||||
|
||||
|
||||
+18
-3
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user