lib/entity/pub_sub.ex

defmodule Ecto.Entity.PubSub do
  defmacro __using__(_) do
    quote do
      @doc """
      Returns event name as an atom

      ## Example
        iex> Module.get_event_name("updated")
        iex> :user_updated

      """
      def get_event(event_name) do
        __MODULE__.get_name() <> "_" <> event_name
        |> String.to_atom()
      end

      @doc """
      Returns current module name as a string
      ## Example
          iex> Module.get_name
          iex> "user"
      """
      def get_name() do
        Phoenix.Naming.resource_name(__MODULE__)
      end

      def subscribe do
        Phoenix.PubSub.subscribe(__MODULE__.get_pub_server(), __MODULE__.get_name())
      end

      @doc false
      def broadcast({:error, _reason} = error, _event), do: error
      def broadcast({:ok, resource}, event) do
        case Phoenix.PubSub.broadcast(__MODULE__.get_pub_server(), __MODULE__.get_name(), {event, resource}) do
          :ok -> {:ok, resource}
           _ ->  IO.puts "Configure you pubsub in `config/config.exs > config :ecto_entity, ecto_pub_sub: Ecto.Entity.PubSub`"
        end
      end
      def broadcast(resource, event) do
        case Phoenix.PubSub.broadcast(__MODULE__.get_pub_server(), __MODULE__.get_name(), {event, resource}) do
          :ok -> resource
           _ ->  IO.puts "Configure you pubsub in `config/config.exs > config :app_name, pubsub_server: Ecto.Entity.PubSub`."
        end
      end

      def maybe_broadcast_event(results, event_name) do
        __MODULE__.broadcast(results, get_event(event_name))
      end
    end
  end
end