lib/chalk/credentials_middleware.ex

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