rebuild(stage-8): deliver market insight workspaces

This commit is contained in:
leefer
2026-07-30 04:12:04 +08:00
parent a18e8e9d27
commit 976a5cac03
39 changed files with 3671 additions and 14 deletions
+38 -4
View File
@@ -5,14 +5,22 @@ from typing import Any
from backend.data.gateway import DataGateway, MarketDataUnavailable
from backend.data.providers.base import ProviderError
from backend.data.quality import DataQualityError
from backend.features.market.insights import MarketInsightService
from backend.features.market.insights.service import MarketInsightError
from backend.features.market.sync import MarketSnapshotService, SnapshotSyncError
from backend.http.errors import AppError
class MarketService:
def __init__(self, gateway: DataGateway, snapshots: MarketSnapshotService) -> None:
def __init__(
self,
gateway: DataGateway,
snapshots: MarketSnapshotService,
insights: MarketInsightService,
) -> None:
self._gateway = gateway
self._snapshots = snapshots
self._insights = insights
def context(self, requested_date: str | None = None) -> dict[str, Any]:
context = self._call(self._gateway.trade_context, requested_date)
@@ -94,11 +102,37 @@ class MarketService:
self._gateway.sector_members, trade_date, sector_name, representative
)
def insight(
self, key: str, requested_date: str | None, user_id: int
) -> dict[str, Any]:
return self._call(self._insights.workspace, key, requested_date, user_id=user_id)
def sync_insight(
self, key: str, requested_date: str | None, user_id: int
) -> dict[str, Any]:
return self._call(
self._insights.workspace, key, requested_date, user_id=user_id, force=True
)
def theme_detail(self, identifier: str, requested_date: str | None = None) -> dict[str, Any]:
return self._call(self._insights.theme_detail, identifier, requested_date)
def save_seat_alias(
self, seat_name: str, alias_name: str, user_id: int
) -> dict[str, str]:
return self._call(self._insights.save_seat_alias, seat_name, alias_name, user_id)
@staticmethod
def _call(function, *args):
def _call(function, *args, **kwargs):
try:
return function(*args)
except (MarketDataUnavailable, ProviderError, DataQualityError, SnapshotSyncError) as exc:
return function(*args, **kwargs)
except (
MarketDataUnavailable,
ProviderError,
DataQualityError,
SnapshotSyncError,
MarketInsightError,
) as exc:
raise AppError("market_data_unavailable", str(exc), 503) from exc