- 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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user