Files
zpark-ems/core/backend/app/api/v1/weather.py

84 lines
2.4 KiB
Python

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))