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