|
# retoor <retoor@molodetz.nl>
|
|
|
|
import logging
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse
|
|
from devplacepy.database import get_table, get_deleted_media
|
|
from devplacepy.attachments import delete_attachment
|
|
from devplacepy.utils import require_admin
|
|
from devplacepy.seo import base_seo_context, site_url, website_schema
|
|
from devplacepy.responses import respond, action_result
|
|
from devplacepy.schemas import AdminMediaOut
|
|
from devplacepy.services.audit import record as audit
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/media", response_class=HTMLResponse)
|
|
async def admin_media(request: Request, page: int = 1):
|
|
admin = require_admin(request)
|
|
media, pagination = get_deleted_media(page)
|
|
base = site_url(request)
|
|
seo_ctx = base_seo_context(
|
|
request,
|
|
title="Media - Admin",
|
|
description="Restore or permanently remove soft-deleted media.",
|
|
robots="noindex,nofollow",
|
|
breadcrumbs=[
|
|
{"name": "Home", "url": "/feed"},
|
|
{"name": "Admin", "url": "/admin"},
|
|
{"name": "Media", "url": "/admin/media"},
|
|
],
|
|
schemas=[website_schema(base)],
|
|
)
|
|
return respond(
|
|
request,
|
|
"admin_media.html",
|
|
{
|
|
**seo_ctx,
|
|
"request": request,
|
|
"user": admin,
|
|
"media": media,
|
|
"pagination": pagination,
|
|
"admin_section": "media",
|
|
},
|
|
model=AdminMediaOut,
|
|
)
|
|
|
|
|
|
@router.post("/media/{uid}/purge")
|
|
async def admin_media_purge(request: Request, uid: str):
|
|
admin = require_admin(request)
|
|
att = get_table("attachments").find_one(uid=uid)
|
|
delete_attachment(uid)
|
|
logger.info(f"Admin {admin['username']} purged media {uid}")
|
|
audit.record(
|
|
request,
|
|
"attachment.delete",
|
|
user=admin,
|
|
target_type="attachment",
|
|
target_uid=uid,
|
|
target_label=att.get("filename") if att else None,
|
|
metadata={"purge": True},
|
|
summary=f"admin {admin['username']} purged attachment {att.get('filename') if att else uid}",
|
|
links=[audit.attachment_link(uid, att.get("filename") if att else None)],
|
|
)
|
|
return action_result(request, "/admin/media")
|