defmodule Xmeta.Xapi.Plug do
use Plug.Router
if Mix.env() == :dev do
use Plug.Debugger
end
use Plug.ErrorHandler
plug(Plug.Parsers,
parsers: [:urlencoded, :json],
json_decoder: Jason
)
plug(Plug.Logger, log: :debug)
plug(:match)
plug(:dispatch)
@impl true
def init(options) do
# initialize options
options
end
defp module_name_upcase(name) do
{first,last} = String.next_grapheme(name)
String.upcase(first) <> last
end
defp format_params(params) do
params
|> Map.delete("glob")
|>Map.delete("xapi_site")
|>Map.delete("xapi_router")
|>Map.delete("xapi_view")
end
#api 路由
match "/:xapi_site/:xapi_router/:xapi_view" do
params = conn.params
site = module_name_upcase(params["xapi_site"])
router = module_name_upcase(params["xapi_router"])
view = module_name_upcase(params["xapi_view"])
mod =
Module.concat(["Xapi", site, router, view])
response = apply(mod, :call, [conn, format_params(conn.params)])
render_json(conn, response)
end
match _ do
send_resp(conn, 404, "not found")
end
defp render_json(conn, response) when is_map(response) do
conn
|> put_resp_content_type("application/json")
|> send_resp(200, Jason.encode!(response))
end
defp render_json(conn, response) when is_binary(response) do
conn
|> send_resp(200, response)
end
end