feat(flywheel): expose incident processing timeline
All checks were successful
CD Pipeline / build-and-deploy (push) Successful in 10m56s

This commit is contained in:
Your Name
2026-04-29 23:38:30 +08:00
parent dae0aa2312
commit 4a57c2d04f
12 changed files with 984 additions and 12 deletions

View File

@@ -921,6 +921,7 @@ class TimelineDBService:
actor_role: str | None = None,
risk_level: str | None = None,
approval_id: str | None = None,
incident_id: str | None = None,
) -> dict[str, Any]:
"""
新增時間軸事件
@@ -935,6 +936,7 @@ class TimelineDBService:
actor_role=actor_role,
risk_level=risk_level,
approval_id=approval_id,
incident_id=incident_id,
)
db.add(event)
await db.flush()
@@ -945,6 +947,7 @@ class TimelineDBService:
id=event.id,
type=event_type,
title=title,
incident_id=incident_id,
)
return {
@@ -952,19 +955,28 @@ class TimelineDBService:
"type": event.event_type,
"status": event.status,
"title": event.title,
"incident_id": event.incident_id,
"created_at": event.created_at.isoformat(),
}
async def get_events(self, limit: int = 50) -> list[dict[str, Any]]:
async def get_events(
self,
limit: int = 50,
incident_id: str | None = None,
approval_ids: list[str] | None = None,
) -> list[dict[str, Any]]:
"""
取得最近的時間軸事件
"""
async with get_db_context() as db:
result = await db.execute(
select(TimelineEvent)
.order_by(TimelineEvent.created_at.desc())
.limit(limit)
)
query = select(TimelineEvent)
if incident_id:
from sqlalchemy import or_
filters = [TimelineEvent.incident_id == incident_id]
if approval_ids:
filters.append(TimelineEvent.approval_id.in_(approval_ids))
query = query.where(or_(*filters))
result = await db.execute(query.order_by(TimelineEvent.created_at.desc()).limit(limit))
events = result.scalars().all()
return [
@@ -978,6 +990,7 @@ class TimelineDBService:
"actor_role": e.actor_role,
"risk_level": e.risk_level,
"approval_id": e.approval_id,
"incident_id": e.incident_id,
"created_at": e.created_at.isoformat(),
}
for e in events