75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
|
from fastapi.responses import StreamingResponse
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from starlette.responses import Response
|
|
|
|
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, export_citations_pdf
|
|
|
|
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}"',
|
|
},
|
|
)
|
|
|
|
|
|
@router.get("/export/pdf")
|
|
async def export_pdf(
|
|
query_id: Optional[uuid.UUID] = None,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
try:
|
|
pdf_bytes = await export_citations_pdf(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}.pdf"
|
|
|
|
return Response(
|
|
content=pdf_bytes,
|
|
media_type="application/pdf",
|
|
headers={
|
|
"Content-Disposition": f'attachment; filename="{filename}"',
|
|
},
|
|
)
|