67 lines
3.3 KiB
Python
67 lines
3.3 KiB
Python
import functools
|
|
from datetime import datetime
|
|
from typing import List
|
|
|
|
from fastapi import FastAPI, Depends, Query
|
|
from enum import Enum
|
|
|
|
from requests import session
|
|
from sqlmodel import Session
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
|
|
from db import get_session
|
|
from models.measurement import IndoorMeasurementCreateRequest, MeasurementListResponse, OutdoorMeasurementCreateRequest, \
|
|
MeasurementResolution, RecordResponse
|
|
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)
|
|
|
|
@app.get('/measurements/records', response_model=RecordResponse, status_code=200)
|
|
async def get_records(station_ids: list[int] | None = Query(default=None), from_timestamp: datetime | None = None, session: Session = Depends(get_session)):
|
|
return RecordResponse.model_validate(measurementService.get_measurement_records(session, station_ids, from_timestamp)) |