feat(governance): link work items to event history
All checks were successful
Code Review / ai-code-review (push) Successful in 11s
CD Pipeline / tests (push) Successful in 3m35s
CD Pipeline / build-and-deploy (push) Successful in 3m50s
CD Pipeline / post-deploy-checks (push) Successful in 1m42s

This commit is contained in:
Your Name
2026-05-20 11:03:52 +08:00
parent 4a24d3e4fc
commit 739a8e0f78
9 changed files with 193 additions and 11 deletions

View File

@@ -54,6 +54,7 @@ router = APIRouter()
@router.get("/ai/governance/events", response_model=GovernanceEventsResponse)
async def get_governance_events(
event_id: Annotated[list[str] | None, Query(alias="event_id")] = None,
event_type: Annotated[list[str] | None, Query(alias="event_type")] = None,
from_: Annotated[datetime | None, Query(alias="from")] = None,
to: Annotated[datetime | None, Query(alias="to")] = None,
@@ -66,6 +67,7 @@ async def get_governance_events(
查詢 AI 治理事件列表(分頁)。
- event_type: 多值過濾(可重複傳)
- event_id: 多值精準過濾(可重複傳),供 Telegram 詳情 / 歷史與 Work Items 錨點回看
- from / to: ISO 8601 時間範圍URL 傳 from 參數)
- status: resolved / unresolved
- severity: critical / warning / info由 event_type 映射決定)
@@ -74,6 +76,7 @@ async def get_governance_events(
"""
logger.debug(
"governance_events_request",
event_ids=event_id,
event_types=event_type,
from_=from_,
to=to,
@@ -83,6 +86,7 @@ async def get_governance_events(
size=size,
)
return await query_governance_events(
event_ids=event_id,
event_types=event_type,
from_dt=from_,
to_dt=to,

View File

@@ -195,6 +195,7 @@ async def _load_dispatch_ids_for_events(event_ids: list[str]) -> dict[str, list[
async def query_governance_events(
*,
event_ids: list[str] | None = None,
event_types: list[str] | None = None,
from_dt: datetime | None = None,
to_dt: datetime | None = None,
@@ -212,6 +213,14 @@ async def query_governance_events(
async with get_db_context() as db:
stmt = select(AiGovernanceEvent)
normalized_event_ids = [
event_id.strip()
for event_id in (event_ids or [])
if isinstance(event_id, str) and event_id.strip()
]
if normalized_event_ids:
stmt = stmt.where(AiGovernanceEvent.id.in_(normalized_event_ids))
if event_types:
stmt = stmt.where(AiGovernanceEvent.event_type.in_(event_types))