Packages

Status monitor for external services

Current section

Files

Jump to
deux lib deux.ex
Raw

lib/deux.ex

defmodule Deux do
@moduledoc """
Status monitor for external services
"""
alias Deux.Workers.{Sources, LocalReports, RemoteSupervisor, RemoteWorker}
@topic "reports"
@doc """
It subscribes to the PubSub reports channel
## Examples
iex> Deux.subscribe()
"""
def subscribe do
Phoenix.PubSub.subscribe(Deux.PubSub, @topic)
end
@doc """
It broadcast the event for a given report
## Examples
ex> Deux.broadcast_report(:update_report, "12452465645352413")
"""
def broadcast_report(event, id) do
Phoenix.PubSub.broadcast(Deux.PubSub, @topic, {event, id})
end
@doc """
Returns and array of all sources
"""
def list_sources, do: {:ok, Sources.all()}
@doc """
Returns a given source
"""
def get_source(%{id: id}), do: get_source(id)
def get_source(id) do
source = Sources.get(id)
if is_nil(source) do
{:error, :not_found}
else
{:ok, source}
end
end
def get_local_report(%{id: id}), do: get_local_report(id)
def get_local_report(id), do: LocalReports.get(id)
def get_remote_report(%{id: id}), do: get_remote_report(id)
def get_remote_report(id), do: RemoteWorker.get(id)
def find_or_add_source(source) do
if report_exists?(source) do
get_source(source)
else
Sources.add(source)
LocalReports.set(source)
RemoteSupervisor.start_child(source)
source
end
end
defp report_exists?(%{id: id}) do
:report_registry
|> Registry.lookup(id)
|> Enum.any?()
end
end