11import datetime as dt
2+ import io
23from typing import Annotated
34
4- from fastapi import APIRouter , Depends , Query
5+ from fastapi import APIRouter , Depends , Query , Form
6+ from fastapi .responses import StreamingResponse
57from geoalchemy2 import WKTElement
8+ import pandas as pd
69from sqlalchemy .orm import Session
710
811from aross_stations_db .api .dependencies import get_db_session
912from aross_stations_db .api .v1 .output import (
1013 StationsGeoJson ,
1114 stations_query_results_to_geojson ,
1215)
13- from aross_stations_db .db .query import stations_query
16+ from aross_stations_db .db .query import (
17+ stations_query ,
18+ station_data_query
19+ )
1420
1521router = APIRouter ()
1622
17-
1823@router .get ("/" )
19- def get (
24+ async def get (
2025 db : Annotated [Session , Depends (get_db_session )],
2126 * ,
2227 start : Annotated [dt .datetime , Query (description = "ISO-format timestamp" )],
@@ -27,3 +32,44 @@ def get(
2732 query = stations_query (db = db , start = start , end = end , polygon = polygon )
2833
2934 return stations_query_results_to_geojson (query .all ())
35+
36+
37+ def station_data (
38+ db : Session ,
39+ start : dt .datetime | None ,
40+ end : dt .datetime | None ,
41+ stations : list [str ]
42+ ) -> StreamingResponse :
43+ now = dt .datetime .now ().strftime ("%Y%m%d%H%M%S" )
44+ fileRoot = 'stationdata'
45+
46+ query = station_data_query (db = db , start = start , end = end , stations = stations )
47+ df = pd .read_sql (query .statement , query .session .connection ())
48+
49+ stream = io .StringIO ()
50+ df .to_csv (stream , index = False )
51+ response = StreamingResponse (iter ([stream .getvalue ()]), media_type = 'text/csv' )
52+ response .headers ['Content-Disposition' ] = f"attachment; filename={ fileRoot } _{ now } .csv"
53+ return response
54+
55+
56+ @router .get ("/data" )
57+ async def station_data_get (
58+ db : Annotated [Session , Depends (get_db_session )],
59+ * ,
60+ start : Annotated [dt .datetime , Query (description = "ISO-format timestamp" )] | None = None ,
61+ end : Annotated [dt .datetime , Query (description = "ISO-format timestamp" )] | None = None ,
62+ stations : Annotated [list [str ], Query (description = "Station ID(s)" )]
63+ ) -> StreamingResponse :
64+ return station_data (db , start , end , stations )
65+
66+
67+ @router .post ("/data" )
68+ async def station_data_post (
69+ db : Annotated [Session , Depends (get_db_session )],
70+ * ,
71+ start : Annotated [dt .datetime , Form (description = "ISO-format timestamp" )] | None = None ,
72+ end : Annotated [dt .datetime , Form (description = "ISO-format timestamp" )] | None = None ,
73+ stations : Annotated [list [str ], Form (description = "Station ID(s)" )]
74+ ) -> StreamingResponse :
75+ return station_data (db , start , end , stations )
0 commit comments