Packages

ExTealPages is a ExTeal tool for managing static copy on pages

Current section

Files

Jump to
ex_teal_pages lib router.ex
Raw

lib/router.ex

defmodule ExTealPages.Router do
@moduledoc """
Routing for ExTeal Pages Addon
"""
use Plug.Router
alias Plug.Conn
alias ExTeal.Panel
alias ExTeal.Resource.{Fields, Serializer, Show}
alias ExTealPages.Page
plug(Plug.Static,
at: "/",
from: {:ex_teal_pages, "priv/static"}
)
plug(Plug.Logger, log: :debug)
plug(Plug.Parsers, parsers: [:urlencoded])
plug(Plug.MethodOverride)
plug(:match)
plug(:dispatch)
def init, do: []
@doc false
def call(conn, opts) do
conn =
conn
|> extract_namespace(opts)
|> Conn.put_private(:plug_skip_csrf_protection, true)
super(conn, opts)
end
get "/" do
{:ok, plugin} = ExTeal.plugin_for("pages")
{:ok, body} =
plugin.options.pages
|> Enum.map(fn module ->
%{
title: module.title(),
key: module.key()
}
end)
|> Jason.encode()
send_resp(conn, 200, body)
end
get "/:page_key" do
page_key
|> page_for()
|> Show.call(conn, page_key)
end
get "/:page_key/update-fields" do
page = page_for(page_key)
model = page.handle_show(conn, page_key)
fields =
:edit
|> Fields.fields_for(page)
|> Fields.apply_values(model, page, conn, :edit, nil)
|> Panel.give_panel_to_fields(page)
panels = Panel.gather_panels(page)
{:ok, body} = Jason.encode(%{fields: fields, panels: panels, title: page.title()})
Serializer.as_json(conn, body, 200)
end
put "/:page_key" do
page_key
|> page_for()
|> Page.update_all_in(conn)
end
defp extract_namespace(conn, opts) do
ns = opts[:namespace] || "teal/plugins/#{ExTealPages.uri()}"
Conn.assign(conn, :namespace, "/" <> ns)
end
defp page_for(key) do
{:ok, plugin} = ExTeal.plugin_for("pages")
Enum.find(plugin.options.pages, &(&1.key() == key))
end
end