reports.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. """Reports API router (P4-M4).
  2. Generate and download simulation reports.
  3. """
  4. import os
  5. from fastapi import APIRouter, HTTPException
  6. from fastapi.responses import FileResponse
  7. from pydantic import BaseModel
  8. from typing import Any, Dict, Optional
  9. from ..services.report_generator import get_report_generator
  10. router = APIRouter(prefix="/api/reports", tags=["reports"])
  11. class GenerateReportRequest(BaseModel):
  12. task_data: Dict[str, Any]
  13. ai_analysis: Optional[Dict[str, Any]] = None
  14. report_title: Optional[str] = None
  15. @router.post("/generate")
  16. async def generate_report(req: GenerateReportRequest) -> Dict[str, Any]:
  17. """Generate a simulation report."""
  18. generator = get_report_generator()
  19. filepath = generator.generate_report(
  20. task_data=req.task_data,
  21. ai_analysis=req.ai_analysis,
  22. report_title=req.report_title,
  23. )
  24. filename = os.path.basename(filepath)
  25. return {"success": True, "filename": filename, "path": filepath}
  26. @router.get("/list")
  27. async def list_reports() -> Dict[str, Any]:
  28. """List all generated reports."""
  29. generator = get_report_generator()
  30. reports = generator.list_reports()
  31. return {"reports": reports, "count": len(reports)}
  32. @router.get("/download/{filename}")
  33. async def download_report(filename: str):
  34. """Download a report file."""
  35. generator = get_report_generator()
  36. filepath = os.path.join(generator.output_dir, filename)
  37. if not os.path.exists(filepath):
  38. raise HTTPException(status_code=404, detail=f"Report {filename} not found")
  39. return FileResponse(filepath, filename=filename)