defmodule SimpleOAuth do
@supported_provider_adapters %{
# %{provider => {adapter, module}}
"google" => {:google, SimpleOAuth.Google},
"wechat_app" => {:wechat_app, SimpleOAuth.Wechat},
"wechat_web" => {:wechat_web, SimpleOAuth.Wechat},
"qq" => {:qq, SimpleOAuth.QQ},
"sgm" => {:sgm, SimpleOAuth.SGM},
"lark" => {:lark, SimpleOAuth.Lark}
}
@supported_providers Map.keys(@supported_provider_adapters)
def config!(adapter_name) when is_atom(adapter_name) do
Application.fetch_env!(:simple_oauth, adapter_name)
end
def get_user_info(provider, code, config \\ nil)
when provider in @supported_providers and is_binary(code) do
{adapter, module} = @supported_provider_adapters[provider]
config = config || config!(adapter)
module.get_user_info(code, config)
end
def token_server_childrens do
@supported_provider_adapters
|> Enum.filter(fn {_provider, {adapter_name, adapter_module}} ->
has_config?(adapter_name) and adapter_module.need_token_server
end)
|> Enum.map(fn {_provider, {_adapter_name, adapter_module}} ->
adapter_module.token_server_spec()
end)
end
def has_config?(adapter_name) do
!!Application.get_env(:simple_oauth, adapter_name)
end
end