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.

53 lines
1.7 KiB

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