from fastapi import APIRouter, Query, Depends from typing import List from loguru import logger from models import NewsItem, HotNews, ApiResponse, DataSourceType from adapters import DataAdapterFactory router = APIRouter(prefix="/news", tags=["新闻资讯"]) def get_data_source(source: str = Query(None)) -> DataSourceType: if source: try: return DataSourceType(source) except ValueError: pass return DataSourceType.EASTMONEY @router.get("/list", response_model=ApiResponse, summary="获取新闻列表") async def get_news_list( limit: int = Query(10, ge=1, le=50, description="返回数量"), source: DataSourceType = Depends(get_data_source) ): try: adapter = DataAdapterFactory.get_adapter(source) data = await adapter.fetch_news(limit) 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 news: {e}") return ApiResponse(success=False, error=str(e)) @router.get("/hot", response_model=ApiResponse, summary="获取热点新闻") async def get_hot_news( limit: int = Query(10, ge=1, le=50, description="返回数量"), source: DataSourceType = Depends(get_data_source) ): try: adapter = DataAdapterFactory.get_adapter(source) data = await adapter.fetch_hot_news(limit) 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 hot news: {e}") return ApiResponse(success=False, error=str(e))