defmodule Chalk.Tesla.CredentialsMiddleware do
alias Chalk.Common.ChalkCredentialsError
@behaviour Tesla.Middleware
@impl Tesla.Middleware
def call(env, next, options) do
# Tesla.run(env, next)
params = %{
client_id: options[:client_id],
client_secret: options[:client_secret],
grant_type: "client_credentials"
}
result =
Chalk.Client.ExchangeCredentials.exchange_credentials(params, %{
api_server: options[:api_server]
})
case result do
{:ok, %{access_token: access_token, primary_environment: primary_environment}} ->
headers =
[
{"Authorization", "Bearer #{access_token}"}
] ++
if primary_environment != nil do
[{"X-Chalk-Env-Id", primary_environment}]
else
[]
end
env
|> Tesla.put_headers(headers)
|> Tesla.run(next)
{:error, %{"detail" => detail, "trace" => trace}} ->
{:current_stacktrace, stacktrace} = Process.info(self(), :current_stacktrace)
{:error,
%ChalkCredentialsError{
detail: detail,
trace: trace,
stacktrace: inspect(stacktrace)
}}
end
end
end