|
import logging
|
|
from fastapi import APIRouter, Request
|
|
from devplacepy.database import get_table
|
|
from devplacepy.attachments import soft_delete_attachment, restore_attachment
|
|
from devplacepy.utils import require_user, require_admin, is_admin, not_found
|
|
from devplacepy.responses import action_result, wants_json, json_error
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
def _media_redirect(request: Request, attachment: dict) -> str:
|
|
referer = request.headers.get("referer", "")
|
|
if referer:
|
|
return referer
|
|
uploader = get_table("users").find_one(uid=attachment.get("user_uid"))
|
|
if uploader:
|
|
return f"/profile/{uploader['username']}?tab=media"
|
|
return "/feed"
|
|
|
|
|
|
@router.post("/{uid}/delete")
|
|
async def delete_media(request: Request, uid: str):
|
|
user = require_user(request)
|
|
attachment = get_table("attachments").find_one(uid=uid)
|
|
if not attachment:
|
|
raise not_found("Media not found")
|
|
if attachment.get("user_uid") != user["uid"] and not is_admin(user):
|
|
if wants_json(request):
|
|
return json_error(403, "Not allowed")
|
|
return action_result(request, _media_redirect(request, attachment))
|
|
soft_delete_attachment(uid)
|
|
logger.info(f"Media {uid} soft-deleted by {user['username']}")
|
|
return action_result(request, _media_redirect(request, attachment))
|
|
|
|
|
|
@router.post("/{uid}/restore")
|
|
async def restore_media(request: Request, uid: str):
|
|
admin = require_admin(request)
|
|
restore_attachment(uid)
|
|
logger.info(f"Media {uid} restored by {admin['username']}")
|
|
return action_result(request, "/admin/media")
|