fix(hub): preserve key monitors when enrich_monitor returns partial payload
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+39
-11
@@ -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")
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
"""hub /api/hub/monitor:enrich 局部返回时须保留 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()
|
||||
Reference in New Issue
Block a user