# retoor 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]})