"""FastAPI sidecar HTTP 接口。""" from __future__ import annotations from typing import Dict, Optional from fastapi import FastAPI, Query from sidecar.config import load_config from sidecar.models import to_dict from sidecar.service import UnifiedDataService, create_default_service app = FastAPI(title="Tortoise Stock Sidecar", version="0.1.0") _service = None # type: Optional[UnifiedDataService] def get_service() -> UnifiedDataService: """ 功能说明:获取全局统一数据服务实例。 参数说明:无。 返回值说明:返回 UnifiedDataService 单例。 注意事项:首次调用时按环境变量懒加载,避免导入模块即连接外部资源。 """ global _service if _service is None: _service = create_default_service(load_config()) return _service @app.get("/health") def health() -> Dict[str, str]: """ 功能说明:返回 sidecar 健康状态。 参数说明:无。 返回值说明:返回包含 status 字段的字典。 注意事项:该接口不触发数据源初始化,适合容器健康检查。 """ return {"status": "ok"} @app.get("/kline/{symbol}") def kline( symbol: str, period: str = Query("day"), limit: int = Query(800, ge=1, le=800), refresh: bool = Query(False), ) -> Dict[str, object]: """ 功能说明:获取统一 K 线数据。 参数说明:symbol 为股票代码,period 为周期,limit 为条数,refresh 表示是否强制刷新。 返回值说明:返回 data 数组包装的 JSON 对象。 注意事项:默认最多返回 800 条,匹配通达信单次 K 线限制。 """ data = [to_dict(item) for item in get_service().get_kline(symbol, period, limit, refresh)] return {"data": data} @app.get("/snapshot/{symbol}") def snapshot(symbol: str, refresh: bool = Query(False)) -> Dict[str, object]: """ 功能说明:获取统一行情快照。 参数说明:symbol 为股票代码,refresh 表示是否强制刷新。 返回值说明:返回 data 对象包装的 JSON 对象。 注意事项:快照默认有短 TTL 缓存,避免频繁穿透远端接口。 """ return {"data": to_dict(get_service().get_snapshot(symbol, refresh))}