lib/chalk/credentials_cache.ex

defmodule Chalk.Client.CredentialsCache do
  use GenServer

  alias Chalk.Client.ExchangeCredentials.Token

  def start_link(opts) do
    GenServer.start_link(__MODULE__, :ok, opts)
  end

  def get() do
    GenServer.call(__MODULE__, {:get, %{}})
  end

  def get(config) do
    GenServer.call(__MODULE__, {:get, config})
  end

  @impl true
  def init(:ok) do
    {:ok, nil}
  end

  @impl true
  def handle_call({:get, config}, _from, nil) do
    get_access_token(config)
  end

  def handle_call({:get, config}, _from, %Token{} = token) do
    if Token.valid?(token) do
      {:reply, token, token}
    else
      get_access_token(config)
    end
  end

  defp get_access_token(config) do
    params = %{
      client_id: "",
      client_secret: ""
    }

    res = Chalk.Client.ExchangeCredentials.exchange_credentials(params, config)

    case res do
      :error ->
        {:reply, :error, nil}

      access_token ->
        {:reply, access_token, access_token}
    end
  end
end