from fastapi import APIRouter, Query, Depends from typing import List from loguru import logger from models import SentimentData, SentimentTrend, ApiResponse, DataSourceType from adapters import DataAdapterFactory router = APIRouter(prefix="/sentiment", tags=["情绪指标"]) def get_data_source(source: str = Query(None)) -> DataSourceType: if source: try: return DataSourceType(source) except ValueError: pass return DataSourceType.EASTMONEY @router.get("/current", response_model=ApiResponse, summary="获取当前情绪指标") async def get_current_sentiment( source: DataSourceType = Depends(get_data_source) ): try: adapter = DataAdapterFactory.get_adapter(source) data = await adapter.fetch_sentiment() return ApiResponse( success=True, data=data.model_dump(), message=f"数据来源: {adapter.name}", ) except Exception as e: logger.error(f"Failed to fetch sentiment: {e}") return ApiResponse(success=False, error=str(e)) @router.get("/trend", response_model=ApiResponse, summary="获取情绪趋势") async def get_sentiment_trend( days: int = Query(15, ge=5, le=30, description="天数"), source: DataSourceType = Depends(get_data_source) ): try: adapter = DataAdapterFactory.get_adapter(source) data = await adapter.fetch_sentiment_trend(days) return ApiResponse( success=True, data=[item.model_dump() for item in data], message=f"数据来源: {adapter.name}", ) except Exception as e: logger.error(f"Failed to fetch sentiment trend: {e}") return ApiResponse(success=False, error=str(e))