WetterstationServer/main.py

62 lines
2.9 KiB
Python

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)