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