56 lines
1.9 KiB
Python
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)
|