lib/step_flow/notification.ex

defmodule StepFlow.Notification do
  @moduledoc """
  Send notifications to endpoint to be forwarded to websockets.
  """

  require Logger

  def send(topic, body) do
    configuration = Application.get_env(:step_flow, StepFlow)

    if Keyword.has_key?(configuration, :endpoint) do
      endpoint =
        configuration
        |> Keyword.get(:endpoint)

      case GenServer.whereis(endpoint) do
        nil ->
          Logger.warn(
            "The notification endpoint #{inspect(endpoint)} is not started yet, cannot send notification: topic=#{inspect(topic)}, body=#{inspect(body)}"
          )

        _pid ->
          do_send(endpoint, topic, body)
      end
    end
  end

  defp do_send(endpoint, topic, body) do
    case endpoint.broadcast("notifications:all", topic, %{
           body: body
         }) do
      {:error, message} ->
        Logger.error("Could not notify endpoint #{inspect(endpoint)}: #{message}")

      _ ->
        :ok
    end
  end
end