Packages

phoenix_kit

1.6.5
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 phoenix_kit migrations postgres v15.ex
Raw

lib/phoenix_kit/migrations/postgres/v15.ex

defmodule PhoenixKit.Migrations.Postgres.V15 do
@moduledoc """
PhoenixKit V15 Migration: Email Templates System
This migration introduces a comprehensive email templates management system
that allows storing, managing and using email templates through the admin interface.
## Changes
### Email Templates System
- Adds phoenix_kit_email_templates table for template storage and management
- Supports template variables with {{variable}} syntax
- Includes template categories (system, marketing, transactional)
- Template versioning and usage tracking
- Integration with existing email logging system
### New Tables
- **phoenix_kit_email_templates**: Template storage with metadata, variables, and usage analytics
## PostgreSQL Support
- Supports PostgreSQL prefix for schema isolation
- Optimized indexes for performance
- JSONB fields for flexible metadata and variables storage
"""
use Ecto.Migration
alias Mix.Tasks.PhoenixKit.SeedTemplates
@doc """
Run the V15 migration to add email templates system.
"""
def up(%{prefix: prefix} = _opts) do
# Create email templates table
create_if_not_exists table(:phoenix_kit_email_templates, prefix: prefix) do
# Template unique name (e.g., "magic_link", "welcome_email")
add :name, :string, null: false
# URL-friendly slug for template identification
add :slug, :string, null: false
# Human-readable display name
add :display_name, :string, null: false
# Template description
add :description, :text, null: true
# Email subject line template
add :subject, :string, null: false
# HTML version of email body
add :html_body, :text, null: false
# Plain text version of email body
add :text_body, :text, null: false
# Template category: system, marketing, transactional
add :category, :string, null: false, default: "transactional"
# Template status: active, draft, archived
add :status, :string, null: false, default: "draft"
# JSONB array of available template variables
add :variables, :map, null: true, default: %{}
# JSONB metadata for additional template information
add :metadata, :map, null: true, default: %{}
# Usage statistics
add :usage_count, :integer, null: false, default: 0
# Last time template was used
add :last_used_at, :utc_datetime_usec, null: true
# Template version for tracking changes
add :version, :integer, null: false, default: 1
# Whether this is a system template (protected from deletion)
add :is_system, :boolean, null: false, default: false
# FK to users who created the template
add :created_by_user_id, :integer, null: true
# FK to users who last updated the template
add :updated_by_user_id, :integer, null: true
# Timestamps for tracking record creation/update
timestamps(type: :utc_datetime_usec)
end
# Create unique indexes
create_if_not_exists unique_index(:phoenix_kit_email_templates, [:name], prefix: prefix)
create_if_not_exists unique_index(:phoenix_kit_email_templates, [:slug], prefix: prefix)
# Create performance indexes
create_if_not_exists index(:phoenix_kit_email_templates, [:category], prefix: prefix)
create_if_not_exists index(:phoenix_kit_email_templates, [:status], prefix: prefix)
create_if_not_exists index(:phoenix_kit_email_templates, [:is_system], prefix: prefix)
create_if_not_exists index(:phoenix_kit_email_templates, [:usage_count], prefix: prefix)
create_if_not_exists index(:phoenix_kit_email_templates, [:last_used_at], prefix: prefix)
create_if_not_exists index(:phoenix_kit_email_templates, [:inserted_at], prefix: prefix)
# Create composite indexes for common queries
create_if_not_exists index(:phoenix_kit_email_templates, [:category, :status], prefix: prefix)
create_if_not_exists index(:phoenix_kit_email_templates, [:status, :is_system],
prefix: prefix
)
# Set version comment on phoenix_kit table for version tracking
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '15'"
# Flush all DDL changes before seeding data
flush()
# Automatically seed system email templates after table creation
seed_system_templates()
end
@doc """
Rollback the V15 migration.
"""
def down(%{prefix: prefix} = _opts) do
# Drop indexes first
drop_if_exists index(:phoenix_kit_email_templates, [:status, :is_system], prefix: prefix)
drop_if_exists index(:phoenix_kit_email_templates, [:category, :status], prefix: prefix)
drop_if_exists index(:phoenix_kit_email_templates, [:inserted_at], prefix: prefix)
drop_if_exists index(:phoenix_kit_email_templates, [:last_used_at], prefix: prefix)
drop_if_exists index(:phoenix_kit_email_templates, [:usage_count], prefix: prefix)
drop_if_exists index(:phoenix_kit_email_templates, [:is_system], prefix: prefix)
drop_if_exists index(:phoenix_kit_email_templates, [:status], prefix: prefix)
drop_if_exists index(:phoenix_kit_email_templates, [:category], prefix: prefix)
drop_if_exists unique_index(:phoenix_kit_email_templates, [:slug], prefix: prefix)
drop_if_exists unique_index(:phoenix_kit_email_templates, [:name], prefix: prefix)
# Drop table
drop_if_exists table(:phoenix_kit_email_templates, prefix: prefix)
# Update version comment on phoenix_kit table to previous version
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '14'"
end
# Private function to seed system email templates
defp seed_system_templates do
case Code.ensure_loaded(SeedTemplates) do
{:module, _} ->
try do
SeedTemplates.run(["--quiet"])
rescue
error ->
# Log the error but don't fail the migration
IO.puts("Warning: Could not seed email templates: #{inspect(error)}")
:ok
end
{:error, _} ->
# Mix tasks may not be available in production builds
IO.puts("Info: SeedTemplates not available - skipping template seeding")
:ok
end
end
# Helper function to build table name with prefix
defp prefix_table_name(table_name, nil), do: table_name
defp prefix_table_name(table_name, prefix), do: "#{prefix}.#{table_name}"
end