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"), }