"""节点实例管理路由。 提供管理后台查看节点实例与手动停止实例的能力。实例生命周期仍由 NodeManager 控制,路由只转发停止请求。 """ from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from app.db import Database from app.node_manager import NodeManager router = APIRouter(prefix="/api/admin/node-instances", tags=["node-instances"]) def _get_db() -> Database: """从应用状态延迟获取数据库实例。""" from app.main import app return app.state.db def _get_manager() -> NodeManager: """从应用状态延迟获取节点管理器。""" from app.main import app return app.state.node_manager @router.get("") def list_instances(db: Database = Depends(_get_db)) -> list[dict]: """返回全部节点实例记录。""" return db.list_instances() @router.post("/{instance_id}/stop") def stop_instance( instance_id: str, db: Database = Depends(_get_db), manager: NodeManager = Depends(_get_manager), ) -> dict: """请求停止指定实例;停止后实例记录保留为 stopped 状态。""" manager.stop_instance(instance_id) instance = next( (item for item in db.list_instances() if item["id"] == instance_id), None, ) if instance is None: raise HTTPException(status_code=404, detail="instance not found") return {"stopped": instance_id}