Packages

phoenix_kit

1.7.66
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 v19.ex
Raw

lib/phoenix_kit/migrations/postgres/v19.ex

defmodule PhoenixKit.Migrations.Postgres.V19 do
@moduledoc """
PhoenixKit V19 Migration: Enhanced Email Status Tracking
Adds additional timestamp fields to phoenix_kit_email_logs table for comprehensive
email lifecycle tracking, enabling full visibility from queue to delivery.
## Changes
### Email Logs Table (phoenix_kit_email_logs)
- Adds `queued_at` timestamp for when email enters send queue
- Adds `rejected_at` timestamp for provider rejections
- Adds `failed_at` timestamp for send failures
- Adds `delayed_at` timestamp for delivery delays
## Features
- **Complete Lifecycle Tracking**: Track emails from queued → sent → delivered
- **Failure Timestamps**: Precise timing for rejections and failures
- **Delay Tracking**: Monitor when emails experience delivery delays
- **Status History**: Enhanced audit trail with granular timestamps
## Email Status Flow
```
QUEUED (queued_at) → SENT (sent_at) → DELIVERED (delivered_at)
↘ FAILED (failed_at)
↘ REJECTED (rejected_at)
DELIVERED → OPENED (opened_at) → CLICKED (clicked_at)
↘ HARD_BOUNCED/SOFT_BOUNCED (bounced_at)
↘ COMPLAINT (complained_at)
↘ DELAYED (delayed_at)
```
## Usage Examples
```elixir
# Email queued for sending
Log.create_log(%{..., status: "queued", queued_at: DateTime.utc_now()})
# Email sent to provider
Log.update_status(log, "sent", %{sent_at: DateTime.utc_now()})
# Email delivery confirmed
Log.mark_as_delivered(log, DateTime.utc_now())
# Email rejected by provider
Log.mark_as_rejected(log, "Invalid recipient", DateTime.utc_now())
```
"""
use Ecto.Migration
@doc """
Run the V19 migration to add enhanced email status tracking fields.
"""
def up(%{prefix: prefix} = _opts) do
alter table(:phoenix_kit_email_logs, prefix: prefix) do
add :queued_at, :utc_datetime_usec
add :rejected_at, :utc_datetime_usec
add :failed_at, :utc_datetime_usec
add :delayed_at, :utc_datetime_usec
end
execute """
COMMENT ON COLUMN #{prefix_table_name("phoenix_kit_email_logs", prefix)}.queued_at IS
'Timestamp when email was queued for sending'
"""
execute """
COMMENT ON COLUMN #{prefix_table_name("phoenix_kit_email_logs", prefix)}.rejected_at IS
'Timestamp when email was rejected by provider'
"""
execute """
COMMENT ON COLUMN #{prefix_table_name("phoenix_kit_email_logs", prefix)}.failed_at IS
'Timestamp when email send failed'
"""
execute """
COMMENT ON COLUMN #{prefix_table_name("phoenix_kit_email_logs", prefix)}.delayed_at IS
'Timestamp when email delivery was delayed'
"""
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '19'"
end
@doc """
Rollback the V19 migration.
"""
def down(%{prefix: prefix} = _opts) do
alter table(:phoenix_kit_email_logs, prefix: prefix) do
remove :queued_at
remove :rejected_at
remove :failed_at
remove :delayed_at
end
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '18'"
end
defp prefix_table_name(table_name, nil), do: table_name
defp prefix_table_name(table_name, prefix), do: "#{prefix}.#{table_name}"
end