lib/plug/router.ex

if Code.ensure_loaded?(Plug) do
  defmodule WeChat.Plug.Router do
    @moduledoc false

    use Plug.Router, copy_opts_to_assign: :wechat_opts
    alias WeChat.Url

    alias WeChat.Plug.{
      FetchAccessToken,
      RefreshAccessToken,
      FetchComponentAccessToken,
      RefreshComponentAccessToken,
      FetchTicket
    }

    plug(:match)
    plug(:dispatch)

    get Url.to_fetch_access_token() do
      Plug.run(conn, [{FetchAccessToken, conn.assigns.wechat_opts}])
    end

    post Url.to_refresh_access_token() do
      Plug.run(conn, [{RefreshAccessToken, conn.assigns.wechat_opts}])
    end

    get Url.to_fetch_component_access_token() do
      Plug.run(conn, [{FetchComponentAccessToken, conn.assigns.wechat_opts}])
    end

    post Url.to_refresh_component_access_token() do
      Plug.run(conn, [{RefreshComponentAccessToken, conn.assigns.wechat_opts}])
    end

    get Url.to_fetch_ticket() do
      Plug.run(conn, [{FetchTicket, conn.assigns.wechat_opts}])
    end

    match _ do
      conn
    end
  end
end