towerops/lib/towerops_web/live/dashboard_live.ex

54 lines
1.7 KiB
Elixir

defmodule ToweropsWeb.DashboardLive do
@moduledoc false
use ToweropsWeb, :live_view
alias Towerops.Alerts
alias Towerops.Equipment
alias Towerops.Sites
@impl true
def mount(_params, _session, socket) do
organization = socket.assigns.current_organization
# Subscribe to real-time alert updates
_ =
if connected?(socket) do
_ = Phoenix.PubSub.subscribe(Towerops.PubSub, "alerts:new")
Phoenix.PubSub.subscribe(Towerops.PubSub, "alerts:resolved")
end
{:ok,
socket
|> assign(:page_title, organization.name)
|> load_dashboard_data(organization.id)}
end
@impl true
def handle_info({:new_alert, _equipment_id, _alert_type}, socket) do
{:noreply, load_dashboard_data(socket, socket.assigns.current_organization.id)}
end
@impl true
def handle_info({:alert_resolved, _equipment_id, _alert_type}, socket) do
{:noreply, load_dashboard_data(socket, socket.assigns.current_organization.id)}
end
defp load_dashboard_data(socket, organization_id) do
active_alerts = Alerts.list_organization_active_alerts(organization_id)
sites_count = length(Sites.list_organization_sites(organization_id))
equipment = Equipment.list_organization_equipment(organization_id)
equipment_by_status =
equipment
|> Enum.group_by(& &1.status)
|> Map.new(fn {status, equip} -> {status, length(equip)} end)
socket
|> assign(:active_alerts, active_alerts)
|> assign(:sites_count, sites_count)
|> assign(:equipment_count, length(equipment))
|> assign(:equipment_up, Map.get(equipment_by_status, :up, 0))
|> assign(:equipment_down, Map.get(equipment_by_status, :down, 0))
|> assign(:equipment_unknown, Map.get(equipment_by_status, :unknown, 0))
end
end