Packages

phoenix_kit

1.7.77
1.7.208 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 modules pages pages.ex
Raw

lib/modules/pages/pages.ex

defmodule PhoenixKit.Modules.Pages do
@moduledoc """
Pages module for file-based content management.
Provides filesystem operations for creating, editing, and organizing
files and folders in a web-based interface.
"""
use PhoenixKit.Module
require Logger
alias PhoenixKit.Modules.Pages.FileOperations
alias PhoenixKit.Modules.Pages.FilePaths
alias PhoenixKit.Modules.Pages.HtmlMetadata
@not_found_enabled_key "pages_handle_not_found"
@not_found_path_key "pages_not_found_page"
@impl PhoenixKit.Module
@doc """
Checks if Pages module is enabled.
## Examples
iex> PhoenixKit.Modules.Pages.enabled?()
true
"""
def enabled? do
PhoenixKit.Settings.get_boolean_setting("pages_enabled", false)
end
@impl PhoenixKit.Module
@doc """
Enables the Pages module.
"""
def enable_system do
PhoenixKit.Settings.update_boolean_setting("pages_enabled", true)
end
@impl PhoenixKit.Module
@doc """
Disables the Pages module.
"""
def disable_system do
PhoenixKit.Settings.update_boolean_setting("pages_enabled", false)
end
@doc """
Returns true when PhoenixKit should keep the 404 inside the Pages module.
"""
def handle_not_found? do
PhoenixKit.Settings.get_boolean_setting(@not_found_enabled_key, false)
end
@doc """
Enables or disables the custom 404 handler.
"""
def update_handle_not_found(enabled?) when is_boolean(enabled?) do
PhoenixKit.Settings.update_boolean_setting(@not_found_enabled_key, enabled?)
end
@doc """
Returns the stored slug (without extension) used for custom 404 pages.
"""
def not_found_slug do
PhoenixKit.Settings.get_setting(@not_found_path_key, "/404")
|> FilePaths.normalize_slug()
end
@doc """
Updates the slug used for the custom 404 page.
"""
def update_not_found_slug(slug) when is_binary(slug) do
normalized = FilePaths.normalize_slug(slug)
PhoenixKit.Settings.update_setting(@not_found_path_key, normalized)
normalized
end
@doc """
Returns the relative file path (with `.md`) for the configured not found page.
"""
def not_found_file_path do
FilePaths.slug_to_file_path(not_found_slug())
end
@doc """
Ensures the configured not found page exists on disk.
Creates a published markdown file with sensible defaults if missing.
"""
def ensure_not_found_page_exists do
relative_path = not_found_file_path()
if FileOperations.file_exists?(relative_path) do
Logger.debug("Pages 404 already exists at #{FileOperations.absolute_path(relative_path)}")
else
full_path = FileOperations.absolute_path(relative_path)
Logger.info("Creating default Pages 404 at #{full_path}")
metadata =
HtmlMetadata.default_metadata()
|> Map.put(:status, "published")
|> Map.put(:title, "Page Not Found")
|> Map.put(:description, "Displayed when a page cannot be located.")
|> Map.put(:slug, String.trim_leading(not_found_slug(), "/"))
body = """
# Page Not Found
The page you are looking for could not be found. It may have been moved or removed.
"""
content = HtmlMetadata.serialize(metadata) <> "\n\n" <> String.trim(body) <> "\n"
case FileOperations.write_file(relative_path, content) do
:ok ->
Logger.info("Default Pages 404 created at #{full_path}")
{:error, reason} ->
Logger.error("Failed to create default Pages 404 at #{full_path}: #{inspect(reason)}")
end
end
relative_path
end
@doc """
Returns the storage mode for a group slug.
Pages always uses timestamp mode (copied from Publishing's listing cache
which supports both timestamp and slug modes).
"""
def get_group_mode(_group_slug), do: "timestamp"
@doc """
Gets the root directory path for pages.
Creates the directory if it doesn't exist.
Uses the parent application's directory, not PhoenixKit's dependency directory.
## Examples
iex> PhoenixKit.Modules.Pages.root_path()
"/path/to/app/priv/static/pages"
"""
def root_path, do: FilePaths.root_path()
# ============================================================================
# Module Behaviour Callbacks
# ============================================================================
@impl PhoenixKit.Module
def module_key, do: "pages"
@impl PhoenixKit.Module
def module_name, do: "Pages"
end