lib/wechat/hub_server.ex

defmodule WeChat.HubServer do
  @moduledoc "Helper for hub server"
  alias WeChat.{Work, Storage.Cache}
  alias Work.Agent, as: WorkAgent

  @type env :: String.t()
  @type url :: String.t()
  @type oauth2_callbacks :: %{env => url}

  @spec set_oauth2_callbacks(WeChat.client(), oauth2_callbacks) :: [true]
  def set_oauth2_callbacks(client, oauth2_callbacks) do
    for {env, url} <- oauth2_callbacks, is_binary(env) and is_binary(url) do
      set_oauth2_env_url(client, env, url)
    end
  end

  @spec set_oauth2_callbacks(WeChat.client(), Work.agent(), oauth2_callbacks) :: [true]
  def set_oauth2_callbacks(client, agent, oauth2_callbacks) do
    for {env, url} <- oauth2_callbacks, is_binary(env) and is_binary(url) do
      set_oauth2_env_url(client, agent, env, url)
    end
  end

  @spec set_oauth2_env_url(WeChat.client(), env, url) :: true
  def set_oauth2_env_url(client, env, url) when is_binary(env) and is_binary(url) do
    Cache.put_cache(client.appid(), {:oauth2_env_url, env}, url)
  end

  @spec set_oauth2_env_url(WeChat.client(), Work.agent(), env, url) :: true
  def set_oauth2_env_url(client, agent, env, url) when is_binary(env) and is_binary(url) do
    WorkAgent.fetch_agent_cache_id!(client, agent)
    |> Cache.put_cache({:oauth2_env_url, env}, url)
  end

  @spec get_oauth2_env_url(WeChat.client(), env) :: nil | url
  def get_oauth2_env_url(client, env) do
    Cache.get_cache(client.appid(), {:oauth2_env_url, env})
  end

  @spec get_oauth2_env_url(WeChat.client(), Work.agent(), env) :: nil | url
  def get_oauth2_env_url(client, agent, env) do
    WorkAgent.fetch_agent_cache_id!(client, agent)
    |> Cache.get_cache({:oauth2_env_url, env})
  end
end