lib/auth0/config.ex

defmodule Auth0.Config do
  alias Auth0.Config

  @moduledoc """
  Documentation for Auth0 Configuration.

  ## properties

  - :domain - Auth0 domain
  - :api_token - API token
  - :client_id - Client ID. This value is ignored when API token is provided.
  - :client_secret - Client Secret. This value is ignored when API token is3 provided.
  - :max_request_retry_count - Max retry count of request when rate limit is exceeded.
  - :correlation_id - Correlation ID
  - :token_cache_disabled - disable token cache
  - :clear_token_cache - clear token cache

  ## available environment

  - AUTH0_DOMAIN - This value is used when `%Config{domain: nil}`.
  - AUTH0_API_TOKEN - This value is used when `%Config{api_token: nil}`.
  - AUTH0_CLIENT_ID - This value is used when `%Config{client_id: nil}`.
  - AUTH0_CLIENT_SECRET - This value is used when `%Config{client_secret: nil}`.
  - AUTH0_MAX_REQUEST_RETRY_COUNT - This value is used when `%Config{max_request_retry_count: nil}`.
  """

  defstruct domain: nil,
            api_token: nil,
            client_id: nil,
            client_secret: nil,
            max_request_retry_count: nil,
            correlation_id: nil,
            token_cache_disabled: false,
            clear_token_cache: false

  @type t :: %__MODULE__{
          domain: String.t(),
          api_token: String.t(),
          client_id: String.t(),
          client_secret: String.t(),
          max_request_retry_count: integer,
          correlation_id: String.t(),
          token_cache_disabled: boolean,
          clear_token_cache: boolean
        }

  @type config :: Config.t()

  @max_request_default_retry_count 3

  @doc """
  get Auth0 domain.

  """
  @spec get_domain(config) :: String.t() | nil
  def get_domain(%Config{domain: nil}), do: System.get_env("AUTH0_DOMAIN")
  def get_domain(%Config{domain: domain}), do: domain

  @doc """
  get API token.

  """
  @spec get_api_token(config) :: String.t() | nil
  def get_api_token(%Config{api_token: nil}), do: System.get_env("AUTH0_API_TOKEN")
  def get_api_token(%Config{api_token: api_token}), do: api_token

  @doc """
  get Client ID..

  """
  @spec get_client_id(config) :: String.t() | nil
  def get_client_id(%Config{client_id: nil}), do: System.get_env("AUTH0_CLIENT_ID")
  def get_client_id(%Config{client_id: client_id}), do: client_id

  @doc """
  get Client Secret.

  """
  @spec get_client_secret(config) :: String.t() | nil
  def get_client_secret(%Config{client_secret: nil}), do: System.get_env("AUTH0_CLIENT_SECRET")
  def get_client_secret(%Config{client_secret: client_secret}), do: client_secret

  @doc """
  get max retry count of request.

  """
  @spec get_max_request_retry_count(config) :: integer
  def get_max_request_retry_count(%Config{max_request_retry_count: nil}),
    do:
      System.get_env(
        "AUTH0_MAX_REQUEST_RETRY_COUNT",
        @max_request_default_retry_count |> to_string
      )
      |> String.to_integer()

  def get_max_request_retry_count(%Config{max_request_retry_count: max_request_retry_count}),
    do: max_request_retry_count
end