Packages

phoenix_kit

1.4.9
1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit_web controllers pages_controller.ex
Raw

lib/phoenix_kit_web/controllers/pages_controller.ex

defmodule PhoenixKitWeb.PagesController do
use PhoenixKitWeb, :controller
alias PhoenixKit.Pages
alias PhoenixKit.Pages.Renderer
@doc """
Renders a public page from the pages directory.
Only renders pages with status "published". Draft and archived pages fall back
to the configured not-found behaviour. When the "Handle 404s in Pages" setting
is disabled, requests are handed back to the parent router so the host
application can keep its existing 404 pipeline.
Path examples:
/pages/test2 -> renders test2.md (if published)
/pages/blog/hello -> renders blog/hello.md (if published)
/test -> handled by the catch-all route and mapped to /test.md
"""
def show(conn, %{"path" => path}) do
if Pages.enabled?() do
file_path = build_file_path(path)
with {:ok, html_content, metadata} <- Renderer.render_file_with_metadata(file_path),
true <- metadata.status == "published" do
render_markdown(conn, file_path, html_content, metadata)
else
_ -> handle_not_found(conn)
end
else
passthrough_to_parent(conn)
end
end
# Private helpers
defp build_file_path(path) when is_list(path) do
# Handle catch-all route: ["blog", "post-1"] -> "/blog/post-1.md"
"/" <> Path.join(path) <> ".md"
end
defp build_file_path(path) when is_binary(path) do
# Handle single path segment: "test2" -> "/test2.md"
"/" <> path <> ".md"
end
defp render_markdown(conn, file_path, html_content, metadata) do
page_title = metadata.title || Path.basename(file_path, ".md")
conn
|> assign(:page_title, page_title)
|> assign(:html_content, html_content)
|> assign(:metadata, metadata)
|> render(:show)
end
defp handle_not_found(conn) do
if Pages.handle_not_found?() do
render_pages_not_found(conn)
else
passthrough_to_parent(conn)
end
end
defp render_pages_not_found(conn) do
Pages.ensure_not_found_page_exists()
case Renderer.render_file_with_metadata(Pages.not_found_file_path()) do
{:ok, html_content, metadata} ->
conn
|> put_status(:not_found)
|> assign(:page_title, metadata.title || "Page Not Found")
|> assign(:html_content, html_content)
|> assign(:metadata, metadata)
|> render(:show)
{:error, _reason} ->
default_not_found(conn)
end
end
defp default_not_found(conn) do
conn
|> put_status(:not_found)
|> put_view(html: PhoenixKitWeb.ErrorHTML)
|> render(:"404")
end
defp passthrough_to_parent(conn) do
router = conn.private[:phoenix_router] || PhoenixKitWeb.Router
raise Phoenix.Router.NoRouteError, conn: conn, router: router
end
end