51 lines
1.2 KiB
Python
51 lines
1.2 KiB
Python
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class WeatherDataIn(BaseModel):
|
|
"""Payload accepted by POST /stations/{station_name}/observations.
|
|
|
|
station_name is taken from the URL path, not the request body.
|
|
"""
|
|
|
|
temperature: float | None = Field(None, description="Temperature in Celsius")
|
|
pressure: float | None = Field(None, description="Atmospheric pressure in hPa")
|
|
relative_humidity: float | None = Field(
|
|
None, description="Relative humidity in percent (0-100)"
|
|
)
|
|
|
|
|
|
class WeatherRecordOut(BaseModel):
|
|
"""A single observation record (includes server-assigned fields)."""
|
|
|
|
id: int
|
|
station_name: str
|
|
temperature: float | None
|
|
pressure: float | None
|
|
relative_humidity: float | None
|
|
received_at: datetime
|
|
|
|
|
|
class ObservationListResponse(BaseModel):
|
|
"""Response for GET /stations/{station_name}/observations."""
|
|
|
|
station_name: str
|
|
count: int
|
|
records: list[WeatherRecordOut]
|
|
|
|
|
|
class StationInfo(BaseModel):
|
|
"""Summary of a known weather station."""
|
|
|
|
name: str
|
|
observation_count: int
|
|
latest_observation_at: datetime | None
|
|
|
|
|
|
class StationListResponse(BaseModel):
|
|
"""Response for GET /stations."""
|
|
|
|
stations: list[StationInfo]
|
|
count: int
|