Packages

phoenix_kit

1.7.21
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 legal services template_generator.ex
Raw

lib/modules/legal/services/template_generator.ex

defmodule PhoenixKit.Modules.Legal.TemplateGenerator do
@moduledoc """
Generates legal page content from EEx templates.
Templates are loaded from:
1. Parent application's `priv/legal_templates/` (for customization)
2. PhoenixKit's bundled templates in `priv/legal_templates/`
## Template Variables
All templates receive these variables:
* `@company_name` - Company name
* `@company_address` - Company address
* `@company_country` - Company country
* `@company_website` - Company website URL
* `@registration_number` - Company registration number
* `@vat_number` - VAT number
* `@dpo_name` - Data Protection Officer name
* `@dpo_email` - DPO email
* `@dpo_phone` - DPO phone
* `@dpo_address` - DPO address
* `@frameworks` - List of selected framework IDs
* `@effective_date` - Current date in ISO format
## Usage
context = %{
company_name: "Acme Corp",
company_address: "123 Main St",
effective_date: "2025-01-15"
}
{:ok, content} = TemplateGenerator.render("privacy_policy.eex", context)
"""
require Logger
@templates_dir "legal_templates"
@doc """
Render a template with the given context.
## Parameters
* `template_name` - Template filename (e.g., "privacy_policy.eex")
* `context` - Map of variables to pass to the template
## Returns
* `{:ok, content}` - Rendered content
* `{:error, reason}` - Error reason
"""
@spec render(String.t(), map()) :: {:ok, String.t()} | {:error, term()}
def render(template_name, context) when is_map(context) do
template_path = get_template_path(template_name)
if File.exists?(template_path) do
try do
# Convert context map to keyword list for EEx
assigns = Enum.map(context, fn {k, v} -> {to_atom(k), v} end)
content = EEx.eval_file(template_path, assigns: assigns)
{:ok, content}
rescue
e in EEx.SyntaxError ->
Logger.error("Template syntax error in #{template_name}: #{inspect(e)}")
{:error, {:syntax_error, e.message}}
e ->
Logger.error("Template rendering error in #{template_name}: #{inspect(e)}")
{:error, {:render_error, Exception.message(e)}}
end
else
Logger.warning("Template not found: #{template_path}")
{:error, :template_not_found}
end
end
@doc """
Get the full path to a template file.
Checks parent application first, then falls back to PhoenixKit templates.
"""
@spec get_template_path(String.t()) :: String.t()
def get_template_path(template_name) do
# Try parent application first
case get_parent_template_path(template_name) do
{:ok, path} -> path
:error -> get_phoenix_kit_template_path(template_name)
end
end
@doc """
List all available templates.
"""
@spec list_available_templates() :: list(String.t())
def list_available_templates do
phoenix_kit_templates = list_phoenix_kit_templates()
parent_templates = list_parent_templates()
(phoenix_kit_templates ++ parent_templates)
|> Enum.uniq()
|> Enum.sort()
end
@doc """
Check if a template exists.
"""
@spec template_exists?(String.t()) :: boolean()
def template_exists?(template_name) do
get_template_path(template_name)
|> File.exists?()
end
# ===================================
# PRIVATE HELPERS
# ===================================
defp get_parent_template_path(template_name) do
case PhoenixKit.Config.get_parent_app() do
nil ->
:error
app ->
try do
priv_dir = Application.app_dir(app, "priv")
path = Path.join([priv_dir, @templates_dir, template_name])
if File.exists?(path) do
{:ok, path}
else
:error
end
rescue
_ -> :error
end
end
end
defp get_phoenix_kit_template_path(template_name) do
priv_dir = :code.priv_dir(:phoenix_kit) |> to_string()
Path.join([priv_dir, @templates_dir, template_name])
rescue
_ ->
# Fallback for development
Path.join(["priv", @templates_dir, template_name])
end
defp list_phoenix_kit_templates do
priv_dir = :code.priv_dir(:phoenix_kit) |> to_string()
templates_dir = Path.join(priv_dir, @templates_dir)
if File.dir?(templates_dir) do
templates_dir
|> File.ls!()
|> Enum.filter(&String.ends_with?(&1, ".eex"))
else
[]
end
rescue
_ -> []
end
defp list_parent_templates do
case PhoenixKit.Config.get_parent_app() do
nil ->
[]
app ->
try do
priv_dir = Application.app_dir(app, "priv")
templates_dir = Path.join(priv_dir, @templates_dir)
if File.dir?(templates_dir) do
templates_dir
|> File.ls!()
|> Enum.filter(&String.ends_with?(&1, ".eex"))
else
[]
end
rescue
_ -> []
end
end
end
defp to_atom(key) when is_atom(key), do: key
defp to_atom(key) when is_binary(key), do: String.to_atom(key)
end