exports.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """Export related API routes."""
  2. from pathlib import Path
  3. from typing import Any, Dict, Optional
  4. from fastapi import APIRouter, Depends, HTTPException, status
  5. from fastapi.responses import FileResponse
  6. from pydantic import BaseModel
  7. from chatfast.db import MessageContent
  8. from chatfast.services.auth import UserInfo, get_current_user
  9. from chatfast.services.chat import (
  10. export_message_to_blog,
  11. get_export_record,
  12. list_exports_for_user,
  13. record_export_entry,
  14. )
  15. class ExportRequest(BaseModel):
  16. content: MessageContent
  17. session_id: Optional[int] = None
  18. router = APIRouter(prefix="/api", tags=["exports"])
  19. @router.post("/export")
  20. async def api_export_message(payload: ExportRequest, current_user: UserInfo = Depends(get_current_user)) -> Dict[str, Any]:
  21. path = await export_message_to_blog(payload.content)
  22. record = await record_export_entry(current_user.id, payload.session_id, path, payload.content)
  23. return {"status": "ok", "path": path, "export": record}
  24. @router.get("/exports/me")
  25. async def api_my_exports(current_user: UserInfo = Depends(get_current_user)) -> Dict[str, Any]:
  26. items = await list_exports_for_user(current_user.id)
  27. return {"items": items}
  28. @router.get("/exports/{export_id}/download")
  29. async def api_download_export(export_id: int, current_user: UserInfo = Depends(get_current_user)) -> FileResponse:
  30. record = await get_export_record(export_id)
  31. if not record:
  32. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="导出记录不存在")
  33. if record["user_id"] != current_user.id and current_user.role != "admin":
  34. raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="无权下载该内容")
  35. file_path = Path(record["file_path"])
  36. if not file_path.exists():
  37. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="导出文件不存在")
  38. return FileResponse(file_path, filename=record["filename"])