from __future__ import annotations from uuid import UUID from fastapi import APIRouter, Depends, Query from fastapi.responses import FileResponse from sqlalchemy.orm import Session from app.db.session import get_db from app.schemas.export import GeoJsonExportRequest, MetadataExportRequest, ReportExportRequest from app.services.export_service import ExportService from app.utils.response import envelope router = APIRouter(prefix="/exports", tags=["exports"]) @router.post("/geojson", response_model=dict) def export_geojson(payload: GeoJsonExportRequest, db: Session = Depends(get_db)): if payload.export_kind == "detection_run" and payload.analysis_run_id is not None: return envelope( ExportService.export_detection_run_geojson(db, payload.analysis_run_id, payload.name).model_dump(mode="json") ) if payload.export_kind == "segmentation_run" and payload.analysis_run_id is not None: return envelope( ExportService.export_segmentation_run_geojson(db, payload.analysis_run_id, payload.name).model_dump(mode="json") ) if payload.dataset_id is not None: return envelope(ExportService.export_dataset_geojson(db, payload.dataset_id, payload.name).model_dump(mode="json")) return envelope({}) @router.post("/metadata", response_model=dict) def export_project_metadata(payload: MetadataExportRequest, db: Session = Depends(get_db)): return envelope(ExportService.export_project_metadata(db, payload.project_id, payload.name).model_dump(mode="json")) @router.post("/report", response_model=dict) def export_project_report(payload: ReportExportRequest, db: Session = Depends(get_db)): return envelope(ExportService.export_project_report(db, payload.project_id, payload.name).model_dump(mode="json")) @router.get("/projects/{project_id}/exports", response_model=dict) def list_project_exports( project_id: UUID, limit: int = Query(default=50, ge=1, le=100), offset: int = Query(default=0, ge=0), db: Session = Depends(get_db), ): return envelope(ExportService.list_project_exports(db, project_id, limit=limit, offset=offset).model_dump(mode="json")) @router.get("/{export_id}", response_model=dict) def get_export(export_id: UUID, db: Session = Depends(get_db)): return envelope(ExportService.get_export(db, export_id).model_dump(mode="json")) @router.get("/{export_id}/download") def download_export(export_id: UUID, db: Session = Depends(get_db)): path = ExportService.get_export_download_path(db, export_id) media_type = "text/html" if path.suffix.lower() in {".html", ".htm"} else "application/json" return FileResponse(path, filename=path.name, media_type=media_type) @router.get("/{export_id}/content", response_model=dict) def get_export_content(export_id: UUID, db: Session = Depends(get_db)): return envelope(ExportService.get_export_content(db, export_id).model_dump(mode="json"))