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.

100 lines
2.9 KiB

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