Files

56 lines
1.9 KiB
Python
Raw Permalink Normal View History

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)