FluxIP/app/dashboard/service.py

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