63 lines
2.3 KiB
Python
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]})
|