lib/auth_web/controller_callbacks.ex

defmodule Legendary.AuthWeb.Pow.ControllerCallbacks do
  @moduledoc """
  Hook into Pow Controllers to provide additional framework feature. In particular,
  we disconnect any active live views when a user logs out. This will cause the
  live view to re-connect with the new session environment.
  """
  alias Pow.Extension.Phoenix.ControllerCallbacks
  alias Plug.Conn

  def before_respond(Pow.Phoenix.SessionController, :create, {:ok, conn}, config) do
    user = conn.assigns.current_user

    conn =
      conn
      |> Conn.put_session(:current_user_id, user.id)
      |> Conn.put_session(:live_socket_id, "users_sockets:#{user.id}")

    ControllerCallbacks.before_respond(
      Pow.Phoenix.SessionController,
      :create,
      {:ok, conn},
      config
    )
  end

  def before_respond(Pow.Phoenix.SessionController, :delete, {:ok, conn}, config) do
    case Conn.get_session(conn, :live_socket_id) do
      nil ->
        nil

      live_socket_id ->
        %{private: %{phoenix_endpoint: endpoint}} = conn

        apply(endpoint, :broadcast, [live_socket_id, "disconnect", %{}])
    end

    conn =
      conn
      |> Conn.delete_session(:live_socket_id)
      |> Conn.delete_session(:current_user_id)

    ControllerCallbacks.before_respond(
      Pow.Phoenix.SessionController,
      :delete,
      {:ok, conn},
      config
    )
  end

  defdelegate before_respond(controller, action, results, config), to: ControllerCallbacks

  defdelegate before_process(controller, action, results, config), to: ControllerCallbacks
end