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