defmodule Procore.Connection do @moduledoc """ Handle Tesla connections for Procore. Additional middleware can be set in the compile-time or runtime configuration: config :tesla, Procore.Connection, base_url: "https://api.procore.com", adapter: Tesla.Adapter.Hackney The default base URL can also be set as: config :procore_sdk, :base_url, "https://api.procore.com" """ @default_base_url Application.compile_env( :procore_sdk, :base_url, "https://api.procore.com" ) @typedoc """ The list of options that can be passed to new/1. - `base_url`: Overrides the base URL on a per-client basis. - `user_agent`: Overrides the User-Agent header. - `access_token`: Sets the Bearer token for authentication. """ @type options :: [ {:base_url, String.t()}, {:user_agent, String.t()}, {:access_token, String.t()} ] @doc "Forward requests to Tesla." @spec request(Tesla.Client.t(), [Tesla.option()]) :: Tesla.Env.result() defdelegate request(client, options), to: Tesla @doc """ Configure a client with no authentication. ### Returns Tesla.Env.client """ @spec new() :: Tesla.Env.client() def new do Tesla.client(middleware(), adapter()) end @doc """ Configure a client that may have authentication. ### Parameters - `options`: a keyword list of options. ### Returns Tesla.Env.client """ @spec new(options) :: Tesla.Env.client() def new(options) when is_list(options) do options |> middleware() |> Tesla.client(adapter()) end @doc """ Returns fully configured middleware for passing to Tesla.client/2. """ @spec middleware(options) :: [Tesla.Client.middleware()] def middleware(options \\ []) do base_url = Keyword.get( options, :base_url, Application.get_env(:procore_sdk, :base_url, @default_base_url) ) tesla_options = Application.get_env(:tesla, __MODULE__, []) middleware = Keyword.get(tesla_options, :middleware, []) json_engine = Keyword.get(tesla_options, :json, Jason) user_agent = Keyword.get( options, :user_agent, Keyword.get( tesla_options, :user_agent, "openapi-generator - Procore 1.0 - elixir" ) ) access_token_middleware = case Keyword.get(options, :access_token) do nil -> [] access_token -> [{Tesla.Middleware.BearerAuth, token: access_token}] end [ {Tesla.Middleware.BaseUrl, base_url}, {Tesla.Middleware.Headers, [{"user-agent", user_agent}]}, {Tesla.Middleware.EncodeJson, engine: json_engine} | access_token_middleware ++ middleware ] end @doc """ Returns the default adapter for this API. """ def adapter do :tesla |> Application.get_env(__MODULE__, []) |> Keyword.get(:adapter, nil) end end