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