Packages

phoenix_kit

1.7.82
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 v13.ex
Raw

lib/phoenix_kit/migrations/postgres/v13.ex

defmodule PhoenixKit.Migrations.Postgres.V13 do
@moduledoc """
PhoenixKit V13 Migration: Enhanced Email Tracking with AWS SES Integration
This migration enhances the email tracking system to support comprehensive
AWS SES event types and improved message ID synchronization.
## Changes
### Email Log Enhancements
- Adds aws_message_id column for improved AWS SES message correlation
- Adds timestamp columns for detailed event tracking (bounced_at, complained_at, opened_at, clicked_at)
- Expands status enum to include all AWS SES event types
- Adds partial unique index on aws_message_id for duplicate prevention (only for non-NULL values)
### Email Event Enhancements
- Adds support for reject, delivery_delay, subscription, and rendering_failure events
- Adds specific fields for new event types (reject_reason, delay_type, subscription_type, failure_reason)
- Expands event_type enum validation
### New Event Types Supported
- **reject**: Email rejected by SES before sending
- **delivery_delay**: Temporary delivery delays
- **subscription**: List subscription/unsubscription events
- **rendering_failure**: Template rendering failures
### New Status Types
- **rejected**: Email rejected by SES
- **delayed**: Email delivery temporarily delayed
- **hard_bounced**: Permanent bounce (non-recoverable)
- **soft_bounced**: Temporary bounce (recoverable)
- **complaint**: Spam complaint received
## PostgreSQL Support
- Supports PostgreSQL prefix for schema isolation
- Uses proper timestamp types for event tracking
- Adds necessary constraints for data integrity
- Backward compatible with existing data
"""
use Ecto.Migration
@doc """
Run the V13 migration to enhance email tracking system.
"""
def up(%{prefix: prefix} = _opts) do
# Enhance phoenix_kit_email_logs table
alter table(:phoenix_kit_email_logs, prefix: prefix) do
# Add aws_message_id for improved correlation with AWS SES
add :aws_message_id, :string, null: true
# Add specific timestamp fields for different event types
add :bounced_at, :utc_datetime_usec, null: true
add :complained_at, :utc_datetime_usec, null: true
add :opened_at, :utc_datetime_usec, null: true
add :clicked_at, :utc_datetime_usec, null: true
end
# Add partial unique constraint on aws_message_id to prevent duplicates
# Only applies when aws_message_id IS NOT NULL (for AWS SES emails)
# Allows multiple NULL values for non-AWS providers (SMTP, Local, Mailgun, etc.)
create unique_index(:phoenix_kit_email_logs, [:aws_message_id],
prefix: prefix,
name: "phoenix_kit_email_logs_aws_message_id_index",
where: "aws_message_id IS NOT NULL"
)
# Enhance phoenix_kit_email_events table
alter table(:phoenix_kit_email_events, prefix: prefix) do
# Add fields for new event types
add :reject_reason, :string, null: true
add :delay_type, :string, null: true
add :subscription_type, :string, null: true
add :failure_reason, :string, null: true
end
# Update status enum validation in application code will handle:
# sent, delivered, bounced, hard_bounced, soft_bounced, opened,
# clicked, failed, rejected, delayed, complaint
# Update event_type enum validation in application code will handle:
# send, delivery, bounce, complaint, open, click, reject,
# delivery_delay, subscription, rendering_failure
# Set version comment on phoenix_kit table for version tracking
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '13'"
end
@doc """
Rollback the V13 migration.
"""
def down(%{prefix: prefix} = _opts) do
# Remove partial unique constraint on aws_message_id
drop_if_exists index(
:phoenix_kit_email_logs,
[:aws_message_id],
prefix: prefix,
name: :phoenix_kit_email_logs_aws_message_id_index
)
# Remove enhancements from phoenix_kit_email_logs table
alter table(:phoenix_kit_email_logs, prefix: prefix) do
remove_if_exists :aws_message_id, :string
remove_if_exists :bounced_at, :utc_datetime_usec
remove_if_exists :complained_at, :utc_datetime_usec
remove_if_exists :opened_at, :utc_datetime_usec
remove_if_exists :clicked_at, :utc_datetime_usec
end
# Remove enhancements from phoenix_kit_email_events table
alter table(:phoenix_kit_email_events, prefix: prefix) do
remove_if_exists :reject_reason, :string
remove_if_exists :delay_type, :string
remove_if_exists :subscription_type, :string
remove_if_exists :failure_reason, :string
end
# Update version comment on phoenix_kit table
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '12'"
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