Packages

phoenix_kit

1.7.21
1.7.210 1.7.209 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 mix tasks phoenix_kit.seed_templates.ex
Raw

lib/mix/tasks/phoenix_kit.seed_templates.ex

defmodule Mix.Tasks.PhoenixKit.SeedTemplates do
@moduledoc """
Seeds the database with system email templates.
This task creates the default system templates for authentication and core functionality.
It's safe to run multiple times as it will not create duplicate templates.
## Usage
mix phoenix_kit.seed_templates
## Options
--force Force recreation of existing templates (will update content)
--quiet Run without output
## Examples
# Seed templates normally
mix phoenix_kit.seed_templates
# Force update existing templates
mix phoenix_kit.seed_templates --force
# Run quietly without output
mix phoenix_kit.seed_templates --quiet
## System Templates
This task will create the following system templates:
- **magic_link** - Magic link authentication email
- **register** - User registration confirmation email
- **reset_password** - Password reset email
- **test_email** - Test email for tracking verification
- **update_email** - Email change confirmation
All templates are marked as system templates and cannot be deleted through the UI.
"""
use Mix.Task
alias PhoenixKit.Modules.Emails.Templates
@requirements ["app.start"]
@impl Mix.Task
def run(args) do
{opts, _args, _invalid} =
OptionParser.parse(args, switches: [force: :boolean, quiet: :boolean])
force = Keyword.get(opts, :force, false)
quiet = Keyword.get(opts, :quiet, false)
unless quiet do
IO.puts("Seeding system email templates...")
end
# Ensure the repo is available and started
case PhoenixKit.Config.get(:repo) do
{:ok, repo_module} ->
try do
_ = repo_module.start_link()
rescue
# Repo might already be started
_ -> :ok
end
:not_found ->
unless quiet do
IO.puts("❌ PhoenixKit repository not configured.")
IO.puts("Please configure PhoenixKit in your application:")
IO.puts("")
IO.puts(" config :phoenix_kit,")
IO.puts(" repo: YourApp.Repo")
IO.puts("")
IO.puts("Then run this command from your application directory.")
end
System.halt(1)
end
case seed_templates(force, quiet) do
{:ok, templates} ->
unless quiet do
IO.puts("✅ Successfully seeded #{length(templates)} system email templates:")
for template <- templates do
status_icon = if template.status == "active", do: "🟢", else: "🟡"
IO.puts(" #{status_icon} #{template.name} (#{template.display_name})")
end
IO.puts("")
IO.puts("Templates are now available in the admin panel at:")
IO.puts(" {your_app_url}/phoenix_kit/admin/emails/templates")
end
:ok
{:error, :seed_failed} ->
IO.puts("❌ Failed to seed some system templates. Check the logs for details.")
System.halt(1)
end
end
defp seed_templates(force, quiet) do
if force do
# Force mode: update existing templates
seed_with_force(quiet)
else
# Normal mode: only create missing templates
Templates.seed_system_templates()
end
end
defp seed_with_force(quiet) do
unless quiet do
IO.puts("🔄 Force mode: Updating existing system templates...")
end
system_templates = [
%{
name: "magic_link",
slug: "magic-link",
display_name: "Magic Link Authentication",
description: "Secure login link email for passwordless authentication",
subject: "Your secure login link",
html_body: Templates.magic_link_html_template(),
text_body: Templates.magic_link_text_template(),
category: "system",
status: "active",
is_system: true,
variables: %{
"user_email" => "User's email address",
"magic_link_url" => "URL for magic link authentication"
},
metadata: %{"source_module" => "users"}
},
%{
name: "register",
slug: "register",
display_name: "Account Confirmation",
description: "Email sent to confirm user registration",
subject: "Confirm your account",
html_body: Templates.register_html_template(),
text_body: Templates.register_text_template(),
category: "system",
status: "active",
is_system: true,
variables: %{
"user_email" => "User's email address",
"confirmation_url" => "URL for account confirmation"
},
metadata: %{"source_module" => "users"}
},
%{
name: "reset_password",
slug: "reset-password",
display_name: "Password Reset",
description: "Email sent for password reset requests",
subject: "Reset your password",
html_body: Templates.reset_password_html_template(),
text_body: Templates.reset_password_text_template(),
category: "system",
status: "active",
is_system: true,
variables: %{
"user_email" => "User's email address",
"reset_url" => "URL for password reset"
},
metadata: %{"source_module" => "users"}
},
%{
name: "test_email",
slug: "test-email",
display_name: "Test Email",
description: "Test email for verifying email tracking system",
subject: "Test Tracking Email - {{timestamp}}",
html_body: Templates.test_email_html_template(),
text_body: Templates.test_email_text_template(),
category: "system",
status: "active",
is_system: true,
variables: %{
"recipient_email" => "Recipient's email address",
"timestamp" => "Current timestamp",
"test_link_url" => "URL for testing link tracking"
},
metadata: %{"source_module" => "admin"}
},
%{
name: "update_email",
slug: "update-email",
display_name: "Email Change Confirmation",
description: "Email sent to confirm email address changes",
subject: "Confirm your email change",
html_body: Templates.update_email_html_template(),
text_body: Templates.update_email_text_template(),
category: "system",
status: "active",
is_system: true,
variables: %{
"user_email" => "User's email address",
"update_url" => "URL for email update confirmation"
},
metadata: %{"source_module" => "users"}
}
]
results =
Enum.map(system_templates, fn template_attrs ->
case Templates.get_template_by_name(template_attrs.name) do
nil ->
# Template doesn't exist, create it
Templates.create_template(template_attrs)
existing_template ->
# Template exists, update it
Templates.update_template(existing_template, template_attrs)
end
end)
if Enum.all?(results, fn {status, _} -> status == :ok end) do
templates = Enum.map(results, fn {:ok, template} -> template end)
{:ok, templates}
else
errors = Enum.filter(results, fn {status, _} -> status == :error end)
unless quiet do
Mix.shell().error("Errors occurred during seeding: #{inspect(errors)}")
end
{:error, :seed_failed}
end
end
end