diff options
Diffstat (limited to 'lib/config.ex')
-rw-r--r-- | lib/config.ex | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/config.ex b/lib/config.ex new file mode 100644 index 0000000..8778e5b --- /dev/null +++ b/lib/config.ex @@ -0,0 +1,77 @@ +defmodule Mailchimp.Config do + use GenServer + + defstruct api_key: nil, api_version: "3.0" + + require Logger + + # Public API + + def start_link(%__MODULE__{}=config) do + Agent.start_link(fn -> config end, name: __MODULE__) + end + + def start_link do + config = %__MODULE__{ + api_key: get_api_key_from_config, + api_version: get_api_version_from_config + } + + Agent.start_link(fn -> config end, name: __MODULE__) + end + + def root_endpoint do + Agent.get(__MODULE__, fn %{api_key: api_key, api_version: api_version} -> + {:ok, shard} = get_shard(api_key) + "https://#{shard}.api.mailchimp.com/#{api_version}/" + end) + end + + def api_key do + Agent.get(__MODULE__, fn %{api_key: api_key} -> api_key end) + end + + def api_version do + Agent.get(__MODULE__, fn %{api_version: api_version} -> api_version end) + end + + def update(config) when is_list(config) do + Agent.update(__MODULE__, fn current_config -> + Enum.reduce(config, current_config, fn({k,v}, acc) -> Map.put(acc, k, v) end) + end) + end + + # Private methods + + defp sanitize_api_key({:system, env_var}) do + sanitize_api_key System.get_env(env_var) + end + + defp sanitize_api_key(api_key) do + api_key + end + + defp get_api_key_from_config do + sanitize_api_key(Application.get_env(:mailchimp, :apikey)) || sanitize_api_key(Application.get_env(:mailchimp, :api_key)) + end + + defp get_api_version_from_config do + Application.get_env(:mailchimp, :api_version) || "3.0" + end + + defp get_shard(api_key) do + shard = api_key + |> String.split(~r{-}) + |> List.last + + case shard do + nil -> + Logger.error "[mailchimp] This doesn't look like an API Key: #{api_key}" + Logger.error "[mailchimp] The API Key should have both a key and a server name, separated by a dash, like this: abcdefg8abcdefg6abcdefg4-us1" + :error + + _ -> + {:ok, shard} + end + end +end |