defmodule Mobilizon.Web.GraphQLSocket do
  use Phoenix.Socket

  use Absinthe.Phoenix.Socket,
    schema: Mobilizon.GraphQL.Schema

  alias Mobilizon.Users.User

  @spec connect(map, Phoenix.Socket.t()) :: {:ok, Phoenix.Socket.t()} | :error
  def connect(%{"token" => token}, socket) do
    with {:ok, authed_socket} <-
           Guardian.Phoenix.Socket.authenticate(socket, Mobilizon.Web.Auth.Guardian, token),
         %User{} = user <- Guardian.Phoenix.Socket.current_resource(authed_socket) do
      authed_socket =
        Absinthe.Phoenix.Socket.put_options(socket,
          context: %{
            current_user: user
          }
        )

      {:ok, authed_socket}
    else
      {:error, _} ->
        :error
    end
  end

  def connect(_args, _socket), do: :error

  @spec id(any) :: nil
  def id(_socket), do: nil
end