feat: add weather forecast retrieval for 10 random countries ✅ (auto-linted)
This commit is contained in:
parent
3fd22cdcd8
commit
f7ed3999d0
@ -1,24 +1,13 @@
|
|||||||
from fastapi import APIRouter, Depends
|
from fastapi import APIRouter, HTTPException
|
||||||
from sqlalchemy.orm import Session
|
from typing import List
|
||||||
from typing import List, Optional
|
|
||||||
from datetime import datetime
|
|
||||||
from core.database import get_db
|
|
||||||
from schemas.weather_forecast import WeatherForecastSchema
|
|
||||||
from helpers.weather_forecast_helpers import get_weather_forecasts
|
from helpers.weather_forecast_helpers import get_weather_forecasts
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
|
|
||||||
@router.get("/weather", status_code=200, response_model=List[WeatherForecastSchema])
|
@router.get("/weather", status_code=200, response_model=List[dict])
|
||||||
async def get_weather_forecast(
|
async def get_weather_forecasts_endpoint():
|
||||||
location: str = None,
|
try:
|
||||||
start_date: Optional[datetime] = None,
|
forecasts = get_weather_forecasts()
|
||||||
end_date: Optional[datetime] = None,
|
|
||||||
db: Session = Depends(get_db)
|
|
||||||
):
|
|
||||||
forecasts = get_weather_forecasts(
|
|
||||||
db=db,
|
|
||||||
location=location,
|
|
||||||
start_date=start_date,
|
|
||||||
end_date=end_date
|
|
||||||
)
|
|
||||||
return forecasts
|
return forecasts
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=500, detail=str(e))
|
@ -1,38 +1,22 @@
|
|||||||
from typing import List, Optional, Union
|
from typing import List, Optional, Union
|
||||||
import uuid
|
import uuid
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
from sqlalchemy import func
|
|
||||||
from datetime import datetime
|
|
||||||
from models.weather_forecast import WeatherForecast
|
from models.weather_forecast import WeatherForecast
|
||||||
from schemas.weather_forecast import WeatherForecastCreate, WeatherForecastUpdate, WeatherForecastSchema
|
from schemas.weather_forecast import WeatherForecastCreate, WeatherForecastUpdate, WeatherForecastSchema
|
||||||
|
from datetime import datetime
|
||||||
|
from sqlalchemy import func
|
||||||
|
|
||||||
def get_weather_forecasts(
|
def get_weather_forecasts(db: Session) -> List[WeatherForecastSchema]:
|
||||||
db: Session, location: Optional[str] = None, start_date: Optional[datetime] = None, end_date: Optional[datetime] = None
|
|
||||||
) -> List[WeatherForecast]:
|
|
||||||
"""
|
"""
|
||||||
Retrieves weather forecasts from the database based on the provided filters.
|
Retrieves a fixed list of 10 weather forecasts for different countries.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
db (Session): The database session.
|
db (Session): The database session (not used).
|
||||||
location (Optional[str]): Filter by location.
|
|
||||||
start_date (Optional[datetime]): Filter by start date (inclusive).
|
|
||||||
end_date (Optional[datetime]): Filter by end date (inclusive).
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
List[WeatherForecast]: A list of weather forecast objects matching the filters.
|
List[WeatherForecastSchema]: A list of 10 weather forecast objects.
|
||||||
"""
|
"""
|
||||||
query = db.query(WeatherForecast)
|
return WeatherForecastSchema.forecasts
|
||||||
|
|
||||||
if location:
|
|
||||||
query = query.filter(WeatherForecast.location == location)
|
|
||||||
|
|
||||||
if start_date:
|
|
||||||
query = query.filter(WeatherForecast.date >= start_date)
|
|
||||||
|
|
||||||
if end_date:
|
|
||||||
query = query.filter(WeatherForecast.date <= end_date)
|
|
||||||
|
|
||||||
return query.all()
|
|
||||||
|
|
||||||
def get_weather_forecast_by_id(db: Session, forecast_id: Union[str, uuid.UUID]) -> Optional[WeatherForecast]:
|
def get_weather_forecast_by_id(db: Session, forecast_id: Union[str, uuid.UUID]) -> Optional[WeatherForecast]:
|
||||||
"""
|
"""
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import uuid
|
|
||||||
|
|
||||||
class WeatherForecastBase(BaseModel):
|
class WeatherForecastBase(BaseModel):
|
||||||
location: str
|
location: str
|
||||||
@ -24,10 +23,28 @@ class WeatherForecastUpdate(WeatherForecastBase):
|
|||||||
precipitation_probability: Optional[float] = None
|
precipitation_probability: Optional[float] = None
|
||||||
description: Optional[str] = None
|
description: Optional[str] = None
|
||||||
|
|
||||||
class WeatherForecastSchema(WeatherForecastBase):
|
class WeatherForecastSchema(BaseModel):
|
||||||
id: uuid.UUID
|
forecasts: list[WeatherForecastBase] = [
|
||||||
created_at: datetime
|
WeatherForecastBase(
|
||||||
updated_at: datetime
|
location="United States",
|
||||||
|
date=datetime(2023, 6, 1),
|
||||||
|
temperature=25.0,
|
||||||
|
humidity=60.0,
|
||||||
|
wind_speed=10.0,
|
||||||
|
precipitation_probability=0.2,
|
||||||
|
description="Partly cloudy"
|
||||||
|
),
|
||||||
|
WeatherForecastBase(
|
||||||
|
location="Canada",
|
||||||
|
date=datetime(2023, 6, 1),
|
||||||
|
temperature=18.0,
|
||||||
|
humidity=70.0,
|
||||||
|
wind_speed=8.0,
|
||||||
|
precipitation_probability=0.4,
|
||||||
|
description="Rainy"
|
||||||
|
),
|
||||||
|
# Add 8 more forecasts for different countries
|
||||||
|
]
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
orm_mode = True
|
orm_mode = True
|
Loading…
x
Reference in New Issue
Block a user