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.8 KiB

from fastapi import APIRouter, Query, Depends
from typing import List
from loguru import logger
from models import HighLowStock, ApiResponse, DataSourceType
from adapters import DataAdapterFactory
router = APIRouter(prefix="/highlow", tags=["新高新低"])
def get_data_source(source: str = Query(None)) -> DataSourceType:
if source:
try:
return DataSourceType(source)
except ValueError:
pass
return DataSourceType.EASTMONEY
@router.get("/high", response_model=ApiResponse, summary="获取创新高股票")
async def get_high_stocks(
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_high_stocks(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 high stocks: {e}")
return ApiResponse(success=False, error=str(e))
@router.get("/low", response_model=ApiResponse, summary="获取创新低股票")
async def get_low_stocks(
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_low_stocks(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 low stocks: {e}")
return ApiResponse(success=False, error=str(e))