lib/user.ex

defmodule Magic.User do
  @moduledoc """
  Provides methods to interact with the User via the Magic API
  """
  alias Magic.Token

  @type issuer :: Token.issuer()
  @type public_address :: Token.public_address()
  @type did_token :: Token.did_token()
  @type user :: %{email: String.t(), issuer: issuer, public_address: public_address}

  @doc """
  Retrieves information about the user by the supplied issuer
  """
  @spec get_metadata_by_issuer(issuer) :: {:ok, user} | {:error, String.t()}
  def get_metadata_by_issuer(issuer, opts \\ []) do
    Magic.API.get_user(issuer, opts)
  end

  @doc """
  Retrieves information about the user by the supplied public address
  """
  @spec get_metadata_by_public_address(public_address) :: {:ok, user} | {:error, String.t()}
  def get_metadata_by_public_address(public_address, opts \\ []) do
    issuer = Token.construct_issuer_with_public_address(public_address)
    get_metadata_by_issuer(issuer, opts)
  end

  @doc """
  Retrieves information about the user by the supplied DID Token
  """
  @spec get_metadata_by_token(did_token) :: {:ok, user} | {:error, String.t()}
  def get_metadata_by_token(did_token, opts \\ []) do
    issuer = Token.get_issuer(did_token)
    get_metadata_by_issuer(issuer, opts)
  end

  @doc """
  Logs a user out of all Magic SDK sessions by the supplied issuer
  """
  @spec logout_by_issuer(issuer) :: {:ok, %{}} | {:error, String.t()}
  def logout_by_issuer(issuer, opts \\ []) do
    Magic.API.logout_user(issuer, opts)
  end

  @doc """
  Logs a user out of all Magic SDK sessions by the supplied public address
  """
  @spec logout_by_public_address(public_address) :: {:ok, %{}} | {:error, String.t()}
  def logout_by_public_address(public_address, opts \\ []) do
    issuer = Token.construct_issuer_with_public_address(public_address)
    logout_by_issuer(issuer, opts)
  end

  @doc """
  Logs a user out of all Magic SDK sessions by the supplied DID Token
  """
  @spec logout_by_token(did_token) :: {:ok, %{}} | {:error, String.t()}
  def logout_by_token(did_token, opts \\ []) do
    issuer = Token.get_issuer(did_token)
    logout_by_issuer(issuer, opts)
  end
end