bf57aed17a
- git mv sanguo_web → _retired/sanguo_web/(git 历史保全+墓碑 README:
归档原因/拍板记录/现役=sanguo_api)
- 退出启动面三处: promote.sh ALL_MODS 白名单(15→14 模块)+docker/Dockerfile:63
COPY+docker/Dockerfile.nas:16 COPY——不可再被部署或启动为服务
- 背景(架构审计 P0-3): 硬编码 SECRET_KEY/admin123 默认口令/CORS 全开/可下
真实订单/零测试/与 sanguo_api 路由冲突; 生产从未部署为服务, 纯误启动风险
(README 旧「生产模式 uvicorn sanguo_web」指引已于 f6ca85e 勘误)
- three-env §3.1 模块清单+§12 矩阵行同步; session-guide §5 角色表前端行
勘误(旧表把 sanguo_web 当前端模块推——实为 legacy 后端, 前端=frontend/)
- 零外部 import(runuweb/tests/packages 全 grep 实证), pytest testpaths=tests
不受影响
Co-Authored-By: Claude Code <notify@anthropic.com>
126 lines
3.2 KiB
Python
126 lines
3.2 KiB
Python
"""
|
|
网关管理路由
|
|
处理网关连接、断开、状态查询
|
|
"""
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from typing import List
|
|
import logging
|
|
|
|
from ..models import GatewayConnectRequest, GatewayDisconnectRequest, GatewayStatus, ApiResponse
|
|
from ..deps import get_current_user, get_vn_service
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/list", response_model=List[GatewayStatus])
|
|
async def list_gateways(
|
|
current_user: dict = Depends(get_current_user),
|
|
vn_service=Depends(get_vn_service)
|
|
):
|
|
"""
|
|
获取所有可用网关列表
|
|
|
|
返回系统支持的所有网关,包括已连接和未连接的网关
|
|
"""
|
|
gateways = await vn_service.get_available_gateways()
|
|
return [
|
|
GatewayStatus(
|
|
gateway_name=g["gateway_name"],
|
|
gateway_type=g.get("gateway_type", "unknown"),
|
|
status=g.get("status", "disconnected")
|
|
)
|
|
for g in gateways
|
|
]
|
|
|
|
|
|
@router.get("/{name}/setting")
|
|
async def get_gateway_setting(
|
|
name: str,
|
|
current_user: dict = Depends(get_current_user),
|
|
vn_service=Depends(get_vn_service)
|
|
):
|
|
"""
|
|
获取网关配置模板
|
|
|
|
返回指定网关的配置模板,用于前端生成配置表单
|
|
"""
|
|
setting = await vn_service.get_gateway_setting(name)
|
|
return {
|
|
"gateway_name": name,
|
|
"setting": setting
|
|
}
|
|
|
|
|
|
@router.get("/{name}/status")
|
|
async def get_gateway_status(
|
|
name: str,
|
|
current_user: dict = Depends(get_current_user),
|
|
vn_service=Depends(get_vn_service)
|
|
):
|
|
"""
|
|
获取网关连接状态
|
|
|
|
返回指定网关的连接状态
|
|
"""
|
|
status_info = await vn_service.get_gateway_status(name)
|
|
return status_info
|
|
|
|
|
|
@router.post("/{name}/connect")
|
|
async def connect_gateway(
|
|
name: str,
|
|
request: GatewayConnectRequest,
|
|
current_user: dict = Depends(get_current_user),
|
|
vn_service=Depends(get_vn_service)
|
|
):
|
|
"""
|
|
连接网关
|
|
|
|
- **gateway_name**: 网关名称
|
|
- **gateway_type**: 网关类型 (ctp, ib, okx, binance)
|
|
- **setting**: 网关配置参数
|
|
"""
|
|
success = await vn_service.connect_gateway(
|
|
gateway_name=request.gateway_name,
|
|
gateway_type=request.gateway_type.value,
|
|
setting=request.setting
|
|
)
|
|
|
|
if success:
|
|
return ApiResponse(
|
|
success=True,
|
|
message=f"Gateway {request.gateway_name} is connecting"
|
|
)
|
|
else:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Failed to connect gateway {request.gateway_name}"
|
|
)
|
|
|
|
|
|
@router.post("/{name}/disconnect")
|
|
async def disconnect_gateway(
|
|
name: str,
|
|
current_user: dict = Depends(get_current_user),
|
|
vn_service=Depends(get_vn_service)
|
|
):
|
|
"""
|
|
断开网关
|
|
|
|
- **name**: 网关名称
|
|
"""
|
|
success = await vn_service.disconnect_gateway(name)
|
|
|
|
if success:
|
|
return ApiResponse(
|
|
success=True,
|
|
message=f"Gateway {name} disconnected successfully"
|
|
)
|
|
else:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Failed to disconnect gateway {name}"
|
|
)
|