defmodule Xmeta.Xadmin.View do
defmacro __using__(opts) do
unless opts[:title], do: raise("plaease set :title in Module: #{__MODULE__}")
quote bind_quoted: [opts: opts] do
Xmeta.Amis.Env.put_module(__MODULE__, :xadmin_api)
if opts[:schema] do
use Params.Schema, Xmeta.Xadmin.View.make_schema(opts[:schema])
end
@config opts
def schema(ctx, params) do
%{}
end
def call(conn, params) do
ctx = %{conn: conn}
schema(ctx, params)
end
def config, do: @config
defp get_schema, do: @config[:schema]
def get_middleware() do
config = config()
middleware = config[:middleware]
if middleware, do: middleware, else: []
end
defoverridable schema: 2, call: 2, valid_schema: 2,get_middleware: 0
end
end
def make_schema(schema) do
Enum.reduce(Map.to_list(schema), %{}, fn(x,acc) ->
{key,data} = x
if is_atom(data) do
put_in(acc,[key],data)
else
data = for x <- data, check_key?(x), do: x
put_in(acc,[key],data)
end
end)
end
defp check_key?(c) do
{key,_} = c
if key in [:name,:des] do
false
else
true
end
end
def check_middleware(ctx, params, module) do
mids = get_module_middleware(module)
Enum.reduce(mids,%{status: 0, data: [], msg: ""}, fn(m,acc) ->
if acc[:status] != 0 do
acc
else
m.call(ctx,params)
end
end)
end
defp get_module_middleware(module) do
slist = Module.split(module)
site_mod = get_module_root(slist,1)
router_mod = get_module_root(slist,2)
site_mod.get_middleware() ++ router_mod.get_middleware() ++ module.get_middleware()
end
defp get_module_root(slist, num) do
new_slist = for x <- 0..num do
Enum.at(slist,x)
end
Module.concat(new_slist)
end
end