fix(hub): preserve key monitors when enrich_monitor returns partial payload

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-03 21:34:39 +08:00
parent f95118065d
commit 7900a68d07
2 changed files with 78 additions and 11 deletions
+39 -11
View File
@@ -52,6 +52,30 @@ def _row_to_dict(row):
return dict(row) if row is not None else {}
def build_hub_monitor_payload(
*,
keys,
orders,
trends,
rolls,
enrich=None,
) -> dict:
"""合并 enrich 增量字段;enrich 只返回 trends 等局部时不得丢掉 keys/orders。"""
payload = {
"ok": True,
"keys": keys,
"orders": orders,
"trends": trends,
"rolls": rolls,
"key_prices": [],
}
if callable(enrich):
extra = enrich(keys=keys, orders=orders, trends=trends, rolls=rolls)
if isinstance(extra, dict):
payload.update(extra)
return payload
_FAIL_HINTS = (
"失败",
"错误",
@@ -280,20 +304,24 @@ def register_hub_routes(app):
enrich = c.get("enrich_monitor")
if callable(enrich):
try:
payload = enrich(keys=keys, orders=orders, trends=trends, rolls=rolls)
if isinstance(payload, dict):
return jsonify({"ok": True, **payload})
return jsonify(
build_hub_monitor_payload(
keys=keys,
orders=orders,
trends=trends,
rolls=rolls,
enrich=enrich,
)
)
except Exception as e:
return jsonify({"ok": False, "msg": str(e)}), 500
return jsonify(
{
"ok": True,
"keys": keys,
"orders": orders,
"trends": trends,
"rolls": rolls,
"key_prices": [],
}
build_hub_monitor_payload(
keys=keys,
orders=orders,
trends=trends,
rolls=rolls,
)
)
@app.route("/api/hub/ohlcv")
+39
View File
@@ -0,0 +1,39 @@
"""hub /api/hub/monitorenrich 局部返回时须保留 keys。"""
from __future__ import annotations
import sys
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from hub_bridge import build_hub_monitor_payload # noqa: E402
class TestHubMonitorPayload(unittest.TestCase):
def test_partial_enrich_keeps_keys(self):
keys = [{"id": 7, "symbol": "BTC/USDT"}]
orders = [{"id": 1}]
trends = [{"id": 9, "symbol": "ETH/USDT"}]
rolls = []
def enrich_only_trends(**_kw):
return {"trends": [{"id": 9, "add_count": 2}]}
out = build_hub_monitor_payload(
keys=keys,
orders=orders,
trends=trends,
rolls=rolls,
enrich=enrich_only_trends,
)
self.assertTrue(out["ok"])
self.assertEqual(out["keys"], keys)
self.assertEqual(out["orders"], orders)
self.assertEqual(out["rolls"], rolls)
self.assertEqual(out["trends"][0]["add_count"], 2)
if __name__ == "__main__":
unittest.main()