lib/xadmin/plug.ex

defmodule Xmeta.Xadmin.Plug do
  use Plug.Router
  require EEx

  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

  get "/" do
    render_html(conn, "home.html", amisJSON: Xmeta.Xapi.Docs.Amis.amisJSON())
    # send_resp(conn, 200, Xmeta.Docs.HomeTemplate.html())
  end

  match "/router/:mod/json" do    
    mod_name = conn.params["mod"]
    mod = mod_name |> String.split(".") |> Module.concat
    conn
    |> put_resp_content_type("application/json")
    |> send_resp(200, Jason.encode!(Xmeta.Xapi.Docs.Amis.get_router_view(mod)))
  end

  match "/view/:mod/json" do    
    mod_name = conn.params["mod"]
    mod = mod_name |> String.split(".") |> Module.concat
    conn
    |> put_resp_content_type("application/json")
    |> send_resp(200, Jason.encode!(Xmeta.Xapi.Docs.Amis.get_view(mod)))
  end


  match _ do
    send_resp(conn, 404, "not found")
  end

  defp render_html(%{status: status} = conn, template, assigns \\ []) do
    template_dir = __MODULE__.__info__(:compile)[:source] |> Path.dirname
    template_dir = template_dir
    body =
      template_dir
      |> Path.join(template)
      |> String.replace_suffix(".html", ".html.eex")
      |> EEx.eval_file(assigns)

    send_resp(conn, status || 200, body)
  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