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
53 lines
1.7 KiB
|
1 month ago
|
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))
|