Files
ad/molodetz/routers/admin/trash.py
T

63 lines
2.3 KiB
Python

# retoor <retoor@molodetz.nl>
from fastapi import APIRouter, HTTPException, Request
from molodetz.constants import SOFT_DELETE_TABLES
from molodetz.database import list_deleted, purge_event, restore_event
from molodetz.responses import action_result, respond
from molodetz.routers.admin._shared import admin_seo
from molodetz.schemas.admin import TrashOut
from molodetz.utils.audit import record
from molodetz.utils.auth import require_admin
router = APIRouter()
LABEL_FIELDS = ("title", "name", "username", "message", "filename", "token")
def _label(row):
for key in LABEL_FIELDS:
if row.get(key):
return str(row[key])[:24] if key == "token" else str(row[key])[:120]
return row.get("uid", "")
@router.get("/trash")
async def trash_index(request: Request):
require_admin(request)
items = []
for table in SOFT_DELETE_TABLES:
if table == "sessions":
continue
for row in list_deleted(table):
items.append({"table": table, "uid": row.get("uid"), "label": _label(row), "deleted_at": row.get("deleted_at"), "deleted_by": row.get("deleted_by")})
items.sort(key=lambda item: item["deleted_at"] or "", reverse=True)
return respond(request, "admin/trash.html", {"items": items, "seo": admin_seo(request, "Trash")}, model=TrashOut)
async def _stamp(request):
if request.headers.get("content-type", "").startswith("application/json"):
data = await request.json()
stamp = data.get("stamp") if isinstance(data, dict) else None
else:
stamp = (await request.form()).get("stamp")
if not stamp:
raise HTTPException(400, "stamp missing")
return str(stamp)
@router.post("/trash/restore")
async def trash_restore(request: Request):
user = require_admin(request)
stamp = await _stamp(request)
tables = restore_event(stamp)
record(request, "admin.trash.restore", payload={"stamp": stamp}, user=user)
return action_result(request, "/admin/trash", data={"tables": tables})
@router.post("/trash/purge")
async def trash_purge(request: Request):
user = require_admin(request)
stamp = await _stamp(request)
purged = purge_event(stamp)
record(request, "admin.trash.purge", payload={"stamp": stamp, "tables": [name for name, _ in purged]}, user=user)
return action_result(request, "/admin/trash", data={"purged": [name for name, _ in purged]})