Files

84 lines
2.4 KiB
Python
Raw Permalink Normal View History

from datetime import datetime
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from pydantic import BaseModel
from app.core.database import get_db
from app.core.deps import get_current_user
from app.models.user import User
from app.services.weather_service import (
get_current_weather, get_forecast, get_weather_history,
get_weather_impact, get_weather_config, update_weather_config,
)
router = APIRouter(prefix="/weather", tags=["气象数据"])
class WeatherConfigUpdate(BaseModel):
api_provider: str | None = None
api_key: str | None = None
location_lat: float | None = None
location_lon: float | None = None
fetch_interval_minutes: int | None = None
is_enabled: bool | None = None
@router.get("/current")
async def current_weather(
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
"""获取当前天气"""
return await get_current_weather(db)
@router.get("/forecast")
async def weather_forecast(
hours: int = Query(default=72, ge=1, le=168),
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
"""获取72h天气预报"""
return await get_forecast(db, hours)
@router.get("/history")
async def weather_history(
start_date: str = Query(..., description="开始日期 e.g. 2026-03-01"),
end_date: str = Query(..., description="结束日期 e.g. 2026-04-01"),
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
"""获取历史天气数据"""
start = datetime.fromisoformat(start_date)
end = datetime.fromisoformat(end_date)
return await get_weather_history(db, start, end)
@router.get("/impact")
async def weather_impact(
days: int = Query(default=30, ge=1, le=365),
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
"""天气对能源的影响分析"""
return await get_weather_impact(db, days)
@router.get("/config")
async def get_config(
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
"""获取气象API配置"""
return await get_weather_config(db)
@router.put("/config")
async def set_config(
data: WeatherConfigUpdate,
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
"""更新气象API配置"""
return await update_weather_config(db, data.model_dump(exclude_none=True))