You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.7 KiB

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