From d659b90cd9aef95968b6d46ed40b573f6c60af79 Mon Sep 17 00:00:00 2001 From: Davide Scaini Date: Sun, 12 Apr 2026 17:46:28 +0200 Subject: [PATCH] =?UTF-8?q?=20=20-=20DELETE=20/api/admin/users/{handle}/ac?= =?UTF-8?q?tivities=20=E2=80=94=20deletes=20all=20activities/*.json,=20wip?= =?UTF-8?q?es=20=5Fmerged/=20and=20=20=20index.json,=20then=20triggers=20a?= =?UTF-8?q?=20rebuild.=20Admin-only.=20=20=20-=20/admin/=20page=20?= =?UTF-8?q?=E2=80=94=20lists=20all=20users,=20each=20with=20a=20"Delete=20?= =?UTF-8?q?activities"=20button.=20Clicking=20asks=20for=20=20=20confirmat?= =?UTF-8?q?ion=20in=20a=20=20before=20firing=20the=20request.=20Bu?= =?UTF-8?q?tton=20shows=20"Deleted=20(N)"=20or=20an=20error=20inline.=20?= =?UTF-8?q?=20=20-=20"Admin"=20nav=20link=20=E2=80=94=20appears=20in=20the?= =?UTF-8?q?=20top-right=20for=20admins=20only,=20hidden=20for=20everyone?= =?UTF-8?q?=20else.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bincio/serve/server.py | 31 +++++++++++ site/src/layouts/Base.astro | 11 +++- site/src/pages/admin/index.astro | 93 ++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 site/src/pages/admin/index.astro diff --git a/bincio/serve/server.py b/bincio/serve/server.py index db95d01..e0887e5 100644 --- a/bincio/serve/server.py +++ b/bincio/serve/server.py @@ -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: diff --git a/site/src/layouts/Base.astro b/site/src/layouts/Base.astro index befcaae..4989589 100644 --- a/site/src/layouts/Base.astro +++ b/site/src/layouts/Base.astro @@ -200,6 +200,13 @@ try { title="" class="text-xs px-2 py-0.5 rounded-full bg-amber-900/60 text-amber-300 border border-amber-700/50 animate-pulse cursor-default" > + + + + + + + + +