- DELETE /api/admin/users/{handle}/activities — deletes all activities/*.json, wipes _merged/ and

index.json, then triggers a rebuild. Admin-only.
  - /admin/ page — lists all users, each with a "Delete activities" button. Clicking asks for
  confirmation in a <dialog> before firing the request. Button shows "Deleted (N)" or an error inline.
  - "Admin" nav link — appears in the top-right for admins only, hidden for everyone else.
This commit is contained in:
Davide Scaini
2026-04-12 17:46:28 +02:00
parent 2774f436d8
commit d659b90cd9
3 changed files with 134 additions and 1 deletions
+31
View File
@@ -437,6 +437,37 @@ async def admin_jobs(bincio_session: Optional[str] = Cookie(default=None)) -> JS
return JSONResponse(jobs)
@app.delete("/api/admin/users/{handle}/activities")
async def admin_delete_activities(
handle: str,
bincio_session: Optional[str] = Cookie(default=None),
) -> JSONResponse:
"""Delete all activity JSON files for a user and wipe the merged cache."""
_require_admin(bincio_session)
user_dir = _get_data_dir() / handle
if not user_dir.is_dir():
raise HTTPException(404, f"No data directory for user '{handle}'")
deleted = 0
activities_dir = user_dir / "activities"
if activities_dir.is_dir():
for f in activities_dir.glob("*.json"):
f.unlink()
deleted += 1
# Wipe merged cache and top-level index so they don't show stale data
import shutil
merged_dir = user_dir / "_merged"
if merged_dir.exists():
shutil.rmtree(merged_dir)
index_file = user_dir / "index.json"
if index_file.exists():
index_file.unlink()
_trigger_rebuild(handle)
return JSONResponse({"ok": True, "deleted": deleted})
# ── Write API (ported from bincio edit, auth-gated) ───────────────────────────
def _user_data_dir(handle: str) -> Path: