defmodule Xmeta.Xapi.Phx do
use Phoenix.Controller,formats: [:html, :json]
import Plug.Conn
def call_api(conn, params) do
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])
apply(mod, :call, [conn, format_params(conn.params)])
end
defp format_params(params) do
params
|> Map.delete("glob")
|>Map.delete("xapi_site")
|>Map.delete("xapi_router")
|>Map.delete("xapi_view")
end
defp module_name_upcase(name) do
{first,last} = String.next_grapheme(name)
String.upcase(first) <> last
end
def controller(conn, params) do
rsp = Xmeta.Xapi.Phx.call_api(conn,params)
json(conn,rsp)
end
defmacro init_api(path) do
quote do
scope unquote(path) do
get "/:xapi_site/:xapi_router/:xapi_view", Xmeta.Xapi.Phx, :controller
post "/:xapi_site/:xapi_router/:xapi_view", Xmeta.Xapi.Phx, :controller
forward "/docs", Xmeta.Xapi.Docs.Plug
end
end
end
end