REFACTOR external service and improve websocket training
This commit is contained in:
36
services/external/app/schemas/city_data.py
vendored
Normal file
36
services/external/app/schemas/city_data.py
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
# services/external/app/schemas/city_data.py
|
||||
"""
|
||||
City Data Schemas - New response types for city-based operations
|
||||
"""
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Optional
|
||||
|
||||
|
||||
class CityInfoResponse(BaseModel):
|
||||
"""Information about a supported city"""
|
||||
city_id: str
|
||||
name: str
|
||||
country: str
|
||||
latitude: float
|
||||
longitude: float
|
||||
radius_km: float
|
||||
weather_provider: str
|
||||
traffic_provider: str
|
||||
enabled: bool
|
||||
|
||||
|
||||
class DataAvailabilityResponse(BaseModel):
|
||||
"""Data availability for a city"""
|
||||
city_id: str
|
||||
city_name: str
|
||||
|
||||
weather_available: bool
|
||||
weather_start_date: Optional[str] = None
|
||||
weather_end_date: Optional[str] = None
|
||||
weather_record_count: int = 0
|
||||
|
||||
traffic_available: bool
|
||||
traffic_start_date: Optional[str] = None
|
||||
traffic_end_date: Optional[str] = None
|
||||
traffic_record_count: int = 0
|
||||
38
services/external/app/schemas/weather.py
vendored
38
services/external/app/schemas/weather.py
vendored
@@ -120,26 +120,6 @@ class WeatherAnalytics(BaseModel):
|
||||
rainy_days: int = 0
|
||||
sunny_days: int = 0
|
||||
|
||||
class WeatherDataResponse(BaseModel):
|
||||
date: datetime
|
||||
temperature: Optional[float]
|
||||
precipitation: Optional[float]
|
||||
humidity: Optional[float]
|
||||
wind_speed: Optional[float]
|
||||
pressure: Optional[float]
|
||||
description: Optional[str]
|
||||
source: str
|
||||
|
||||
class WeatherForecastResponse(BaseModel):
|
||||
forecast_date: datetime
|
||||
generated_at: datetime
|
||||
temperature: Optional[float]
|
||||
precipitation: Optional[float]
|
||||
humidity: Optional[float]
|
||||
wind_speed: Optional[float]
|
||||
description: Optional[str]
|
||||
source: str
|
||||
|
||||
class LocationRequest(BaseModel):
|
||||
latitude: float
|
||||
longitude: float
|
||||
@@ -174,4 +154,20 @@ class HourlyForecastResponse(BaseModel):
|
||||
wind_speed: Optional[float]
|
||||
description: Optional[str]
|
||||
source: str
|
||||
hour: int
|
||||
hour: int
|
||||
|
||||
class WeatherForecastAPIResponse(BaseModel):
|
||||
"""Simplified schema for API weather forecast responses (without database fields)"""
|
||||
forecast_date: datetime = Field(..., description="Date for forecast")
|
||||
generated_at: datetime = Field(..., description="When forecast was generated")
|
||||
temperature: Optional[float] = Field(None, ge=-50, le=60, description="Forecasted temperature")
|
||||
precipitation: Optional[float] = Field(None, ge=0, description="Forecasted precipitation")
|
||||
humidity: Optional[float] = Field(None, ge=0, le=100, description="Forecasted humidity")
|
||||
wind_speed: Optional[float] = Field(None, ge=0, le=200, description="Forecasted wind speed")
|
||||
description: Optional[str] = Field(None, max_length=200, description="Forecast description")
|
||||
source: str = Field("aemet", max_length=50, description="Data source")
|
||||
|
||||
class Config:
|
||||
json_encoders = {
|
||||
datetime: lambda v: v.isoformat()
|
||||
}
|
||||
Reference in New Issue
Block a user