Merge commit '026c837b919ab4380e8a6e6c052364bbf9bbe8a3' as 'core'
This commit is contained in:
83
core/backend/app/api/v1/weather.py
Normal file
83
core/backend/app/api/v1/weather.py
Normal file
@@ -0,0 +1,83 @@
|
||||
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))
|
||||
Reference in New Issue
Block a user