Files
update-server/app/api/routes/admin_crash_report.py
T

56 lines
1.9 KiB
Python

from pathlib import Path
from fastapi import APIRouter, Depends, Header, HTTPException, Request
from fastapi.responses import FileResponse
from app.core.security import AdminPrincipal, require_permission
from app.repositories import crash_report_repository
router = APIRouter(tags=["admin-crash-report"])
@router.get("/admin/crash-report/list")
def admin_crash_report_list(limit: int = 300, auth=Depends(require_permission("crash:view"))):
limit = max(1, min(limit, 1000))
return {"list": crash_report_repository.list_crash_reports(limit)}
@router.get("/admin/crash-report/file/{report_id}/{file_name}")
def admin_crash_report_file(
report_id: str,
file_name: str,
request: Request,
auth: AdminPrincipal = Depends(require_permission("crash:view")),
):
allowed = {
"metadata": "metadata.json",
"metadata.json": "metadata.json",
"minidump": "crash.dmp",
"crash.dmp": "crash.dmp",
"attachments": "attachments.zip",
"attachments.zip": "attachments.zip",
"server": "server.json",
"server.json": "server.json",
}
stored_name = allowed.get(file_name)
if not stored_name:
raise HTTPException(status_code=404, detail="崩溃报告文件不存在")
row = crash_report_repository.get_crash_report(report_id)
if not row:
raise HTTPException(status_code=404, detail="崩溃报告不存在")
target = Path(row["storage_path"]) / stored_name
if not target.is_file():
raise HTTPException(status_code=404, detail="崩溃报告文件不存在")
crash_report_repository.log_file_access(
report_id,
stored_name,
auth.actor_hash,
request.client.host if request.client else "",
request.headers.get("user-agent", "")[:300],
)
return FileResponse(target, media_type="application/octet-stream", filename=stored_name)