lib/simple_oauth.ex

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