geo/backend/app/api/reports.py

47 lines
1.3 KiB
Python

import uuid
from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, Query, status
from fastapi.responses import StreamingResponse
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.deps import get_current_user
from app.database import get_db
from app.models.user import User
from app.services.citation import export_citations_csv
router = APIRouter()
@router.get("/export/csv")
async def export_report(
query_id: uuid.UUID = Query(...),
format: str = Query("csv"),
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
if format != "csv":
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Only CSV format is supported",
)
try:
csv_content = await export_citations_csv(db, current_user.id, query_id)
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=str(e),
)
date_str = datetime.now().strftime("%Y%m%d")
filename = f"geo-report-{date_str}.csv"
return StreamingResponse(
iter([csv_content]),
media_type="text/csv",
headers={
"Content-Disposition": f'attachment; filename="{filename}"',
},
)