58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from app.core.time import utc_now
|
|
from app.fleet.repository import FleetRepository
|
|
from app.rotation.repository import RotationRepository
|
|
|
|
|
|
class DashboardService:
|
|
def __init__(
|
|
self,
|
|
fleet_repository: FleetRepository,
|
|
rotation_repository: RotationRepository,
|
|
) -> None:
|
|
self.fleet_repository = fleet_repository
|
|
self.rotation_repository = rotation_repository
|
|
|
|
async def get_status(self, refresh: bool = False) -> dict[str, object]:
|
|
del refresh
|
|
instances = self.fleet_repository.list_instances()
|
|
groups = self.fleet_repository.list_groups()
|
|
active = self.rotation_repository.get_active()
|
|
recent, _ = self.rotation_repository.list_runs(1, 6)
|
|
next_runs = [group.next_run_at for group in groups if group.enabled and group.next_run_at]
|
|
instance_by_id = {instance.id: instance for instance in instances}
|
|
group_rows = []
|
|
for group in groups:
|
|
members = [
|
|
instance_by_id[instance_id]
|
|
for instance_id in group.member_ids
|
|
if instance_id in instance_by_id
|
|
]
|
|
group_rows.append(
|
|
{
|
|
**group.to_dict(),
|
|
"member_count": len(members),
|
|
"enabled_member_count": sum(1 for member in members if member.enabled),
|
|
}
|
|
)
|
|
active_data = active.to_dict() if active else None
|
|
if active and active.current_item_id:
|
|
current = self.rotation_repository.get_item(active.current_item_id)
|
|
if current:
|
|
active_data["current_item"] = current.to_dict()
|
|
return {
|
|
"summary": {
|
|
"instances": len(instances),
|
|
"enabled_instances": sum(1 for instance in instances if instance.enabled),
|
|
"groups": len(groups),
|
|
"enabled_groups": sum(1 for group in groups if group.enabled),
|
|
"active_runs": 1 if active else 0,
|
|
"next_run_at": min(next_runs) if next_runs else None,
|
|
},
|
|
"groups": group_rows,
|
|
"active_run": active_data,
|
|
"recent_runs": [run.to_dict() for run in recent],
|
|
"server_time": utc_now().isoformat().replace("+00:00", "Z"),
|
|
}
|