defmodule Xmeta.Xadmin.Phx do
use Phoenix.Controller,formats: [:html, :json]
import Plug.Conn
def call_api(conn, params) do
site = module_name_upcase(params["xadmin_site"])
router = module_name_upcase(params["xadmin_router"])
view = module_name_upcase(params["xadmin_view"])
mod =
Module.concat(["Xadmin", site, router, view])
apply(mod, :call, [conn, format_params(conn.params)])
end
defp format_params(params) do
params
|> Map.delete("glob")
|>Map.delete("xadmin_site")
|>Map.delete("xadmin_router")
|>Map.delete("xadmin_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.Xadmin.Phx.call_api(conn,params)
json(conn,rsp)
end
defmacro init_xadmin(path) do
quote do
scope unquote(path) do
get "/:xadmin_site/:xadmin_router/:xadmin_view", Xmeta.Xadmin.Phx, :controller
post "/:xadmin_site/:xadmin_router/:xadmin_view", Xmeta.Xadmin.Phx, :controller
end
end
end
end