import functools from datetime import datetime from typing import List from fastapi import FastAPI, Depends, Query from enum import Enum from sqlmodel import Session from fastapi.middleware.cors import CORSMiddleware from db import get_session from models.measurement import IndoorMeasurementCreateRequest, MeasurementListResponse, OutdoorMeasurementCreateRequest, \ MeasurementResolution from models.station import StationCreateRequest, StationCreateResponse, Station, StationListResponse, \ StationUpdateResponse, StationUpdateRequest from services import stationService, measurementService app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["http://localhost:4200"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/stations/list", response_model=List[StationListResponse], status_code=201) async def list_stations(session: Session = Depends(get_session)): result = stationService.list_stations(session) return [StationListResponse.model_validate(station) for station in result] @app.post("/stations/create", response_model=StationCreateResponse, status_code=200) async def create_station(station_data: StationCreateRequest, session: Session = Depends(get_session)) -> StationCreateResponse: station = stationService.create_station(session, station_data) return StationCreateResponse.model_validate(station) @app.patch("/stations/update", response_model=StationUpdateResponse, status_code=200) async def update_station(station_data: StationUpdateRequest, session: Session = Depends(get_session)): station = stationService.update_station(session, station_data) return StationUpdateResponse.model_validate(station) @app.delete("/stations/{station_id}", status_code=204) async def delete_station(station_id: int, session: Session = Depends(get_session)): stationService.delete_station(session, station_id) @app.post("/measurements/indoor", status_code=204) async def create_indoor_measurement(data: IndoorMeasurementCreateRequest, session: Session = Depends(get_session)): measurementService.push_indoor_measurement(session, data) @app.post("/measurements/outdoor", status_code=204) async def create_outdoor_measurement(data: OutdoorMeasurementCreateRequest, session: Session = Depends(get_session)): measurementService.push_outdoor_measurement(session, data) @app.get("/measurements", response_model=MeasurementListResponse, status_code=200) async def get_measurements( station_ids: list[int] | None = Query(default=None), indoor: bool | None = Query(default=None), from_timestamp: datetime | None = None, to_timestamp: datetime | None = None, resolution: MeasurementResolution = MeasurementResolution.hourly, limit: int | None = None, session: Session = Depends(get_session)): return measurementService.get_measurements(session, station_ids, indoor, from_timestamp, to_timestamp, limit, resolution)