Current section
Files
Jump to
Current section
Files
lib/zepto/application.ex
defmodule Zepto.Application do
@moduledoc """
The Zepto Application module.
Starts and supervises TokenManager processes for each configured environment.
Optionally starts the Mock Server when configured.
"""
use Application
alias Zepto.Client.TokenManager
@impl true
def start(_type, _args) do
children = build_children()
opts = [strategy: :one_for_one, name: Zepto.Supervisor]
Supervisor.start_link(children, opts)
end
defp build_children do
token_managers = build_token_managers()
mock_server = maybe_mock_server()
token_managers ++ mock_server
end
defp build_token_managers do
environments = Application.get_env(:zepto, :environments, [])
Enum.map(environments, fn {env_name, env_config} ->
token_manager_name = token_manager_name(env_name)
Supervisor.child_spec(
{TokenManager,
[
name: token_manager_name,
environment: env_name,
oauth_url: env_config[:oauth_url],
client_id: env_config[:client_id],
client_secret: env_config[:client_secret],
token_callback: env_config[:token_callback]
]},
id: token_manager_name
)
end)
end
defp maybe_mock_server do
mock_config = Application.get_env(:zepto, :mock_server, [])
if mock_config[:enabled] && mock_config[:repo] do
[Zepto.MockServer.Supervisor]
else
[]
end
end
@doc """
Returns the TokenManager process name for a given environment.
## Examples
iex> Zepto.Application.token_manager_name(:sandbox)
Zepto.TokenManager.Sandbox
iex> Zepto.Application.token_manager_name(:prod)
Zepto.TokenManager.Prod
"""
@spec token_manager_name(atom()) :: atom()
def token_manager_name(environment) when is_atom(environment) do
env_string =
environment
|> Atom.to_string()
|> String.split("_")
|> Enum.map(&String.capitalize/1)
|> Enum.join("")
Module.concat(Zepto.TokenManager, env_string)
end
end