# -*- coding: utf-8 -*- """ =================================== Sector data endpoints =================================== Responsibilities: 1. Provide sector momentum data 2. Provide sector ranking """ import logging from datetime import datetime from typing import Optional, List from fastapi import APIRouter, Query, Depends from api.v1.schemas.market import ( SectorMomentum, SectorListResponse, KLineChartResponse, ) from api.v1.schemas.common import ErrorResponse from src.services.market_service import MarketService logger = logging.getLogger(__name__) router = APIRouter() def get_market_service() -> MarketService: """Dependency injection for MarketService""" return MarketService() @router.get( "", response_model=SectorListResponse, responses={ 200: {"description": "Sector momentum list"}, 500: {"description": "Server error", "model": ErrorResponse}, }, summary="Get sector momentum list", description="Get sector momentum ranking with sorting options" ) def get_sectors( sort: str = Query("momentumValue", description="Sort field (momentumValue, momentumScore, changePercent, rankChange)"), order: str = Query("desc", description="Sort order (asc, desc)"), limit: int = Query(20, ge=1, le=100, description="Limit count"), period: int = Query(5, ge=1, le=60, description="Period for calculating momentum (days)"), service: MarketService = Depends(get_market_service) ) -> SectorListResponse: """ Get sector momentum list Returns sector momentum data sorted by specified field """ try: sectors = service.get_sector_momentum(sort=sort, order=order, limit=limit, period=period) return SectorListResponse( items=sectors, total=len(sectors) ) except Exception as e: logger.error(f"Failed to get sector momentum: {e}", exc_info=True) return SectorListResponse(items=[], total=0) @router.get( "/{sector_code}/kline", response_model=KLineChartResponse, responses={ 200: {"description": "Sector K-line chart data"}, 404: {"description": "Sector not found", "model": ErrorResponse}, 500: {"description": "Server error", "model": ErrorResponse}, }, summary="Get sector K-line chart", description="Get sector K-line chart data for ECharts" ) def get_sector_kline( sector_code: str, days: int = Query(60, ge=1, le=365, description="Number of days"), service: MarketService = Depends(get_market_service) ) -> KLineChartResponse: """ Get sector K-line chart data Returns K-line data formatted for ECharts """ try: kline = service.get_sector_kline(sector_code, days=days) return kline except Exception as e: logger.error(f"Failed to get sector kline: {e}", exc_info=True) return KLineChartResponse( categoryData=[], values=[], volumes=[], stock_name=None )