Packages

phoenix_kit

1.2.10
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 email_verify_config.ex
Raw

lib/mix/tasks/phoenix_kit/email_verify_config.ex

defmodule Mix.Tasks.PhoenixKit.Email.VerifyConfig do
@shortdoc "Verify email tracking configuration"
@moduledoc """
Mix task to verify email tracking system configuration.
## Usage
# Verify basic configuration
mix phoenix_kit.email.verify_config
# Verify AWS SES setup
mix phoenix_kit.email.verify_aws_ses
# Detailed verification with connectivity tests
mix phoenix_kit.email.verify_config --detailed
# Check specific configuration aspect
mix phoenix_kit.email.verify_config --check database
mix phoenix_kit.email.verify_config --check mailer
mix phoenix_kit.email.verify_config --check settings
## Options
--detailed Run detailed checks including connectivity
--check ASPECT Check specific aspect: database, mailer, settings, aws
--fix-issues Attempt to fix common configuration issues
--quiet Only show errors and warnings
## Checks Performed
### Basic Checks
- Email tracking system enabled/disabled status
- Database tables and schemas exist
- Required settings are configured
- Mailer configuration is valid
### AWS SES Checks (with --detailed)
- AWS credentials are configured
- SES configuration set exists
- SNS topic and subscriptions are set up
- Webhook endpoint is accessible
### Database Checks
- Tables exist and have correct schema
- Indexes are properly created
- Sample data can be inserted and retrieved
## Examples
# Quick config check
mix phoenix_kit.email.verify_config
# Full AWS SES verification
mix phoenix_kit.email.verify_config --detailed --check aws
# Database-only check with fix attempt
mix phoenix_kit.email.verify_config --check database --fix-issues
"""
use Mix.Task
alias PhoenixKit.{EmailTracking, Settings}
def run(args) do
Mix.Task.run("app.start")
{options, _remaining} = parse_options(args)
Mix.shell().info(IO.ANSI.cyan() <> "\n🔍 Email Configuration Verification" <> IO.ANSI.reset())
Mix.shell().info(String.duplicate("=", 55))
case options[:check] do
"database" ->
run_database_checks(options)
"mailer" ->
run_mailer_checks(options)
"settings" ->
run_settings_checks(options)
"aws" ->
run_aws_checks(options)
nil ->
run_all_checks(options)
check_type ->
Mix.shell().error("Unknown check type: #{check_type}")
exit({:shutdown, 1})
end
end
defp parse_options(args) do
{options, remaining, _errors} =
OptionParser.parse(args,
strict: [
detailed: :boolean,
check: :string,
fix_issues: :boolean,
quiet: :boolean
]
)
# Set defaults
options =
options
|> Keyword.put_new(:detailed, false)
|> Keyword.put_new(:fix_issues, false)
|> Keyword.put_new(:quiet, false)
{options, remaining}
end
defp run_all_checks(options) do
checks = [
{"System Status", &check_system_status/1},
{"Database Setup", &check_database_setup/1},
{"Settings Configuration", &check_settings_config/1},
{"Mailer Integration", &check_mailer_integration/1}
]
checks =
if options[:detailed] do
checks ++ [{"AWS SES Integration", &check_aws_integration/1}]
else
checks
end
results =
Enum.map(checks, fn {name, check_func} ->
Mix.shell().info("\n🔍 #{name}...")
result = check_func.(options)
{name, result}
end)
show_summary(results, options)
end
defp run_database_checks(options) do
Mix.shell().info("\n🗄️ Database Checks...")
result = check_database_setup(options)
show_single_result("Database Setup", result, options)
end
defp run_mailer_checks(options) do
Mix.shell().info("\n📧 Mailer Checks...")
result = check_mailer_integration(options)
show_single_result("Mailer Integration", result, options)
end
defp run_settings_checks(options) do
Mix.shell().info("\n⚙️ Settings Checks...")
result = check_settings_config(options)
show_single_result("Settings Configuration", result, options)
end
defp run_aws_checks(options) do
Mix.shell().info("\n☁️ AWS SES Checks...")
result = check_aws_integration(options)
show_single_result("AWS SES Integration", result, options)
end
defp check_system_status(_options) do
checks = [
{"Email tracking enabled", EmailTracking.enabled?()},
{"Module loaded", Code.ensure_loaded?(PhoenixKit.EmailTracking)},
{"Migration applied", migration_applied?()},
{"Tables exist", tables_exist?()}
]
issues =
checks
|> Enum.filter(fn {_name, status} -> not status end)
|> Enum.map(fn {name, _} -> name end)
if issues == [] do
{:ok, "System is properly configured"}
else
{:warning, "Issues found: #{Enum.join(issues, ", ")}"}
end
end
defp check_database_setup(options) do
# Check table existence
if tables_exist?() do
# Test basic operations
case test_database_operations() do
:ok -> {:ok, "Database setup is correct"}
{:error, reason} -> {:error, "Database operations failed: #{reason}"}
end
else
if options[:fix_issues] do
Mix.shell().info(" 🔧 Attempting to run migration...")
{:error, "Migration needs to be run manually: mix ecto.migrate"}
else
{:error, "Email tracking tables do not exist. Run: mix ecto.migrate"}
end
end
rescue
error ->
{:error, "Database check failed: #{Exception.message(error)}"}
end
defp check_settings_config(_options) do
required_settings = [
"email_tracking_enabled",
"email_tracking_save_body",
"email_tracking_retention_days"
]
missing_settings =
required_settings
|> Enum.filter(fn setting ->
Settings.get_setting(setting) == nil
end)
if missing_settings == [] do
retention_days = EmailTracking.get_retention_days()
cond do
retention_days < 1 ->
{:error, "Invalid retention days: #{retention_days}"}
retention_days > 365 ->
{:warning, "Very long retention period: #{retention_days} days"}
true ->
{:ok, "Settings properly configured (#{retention_days} days retention)"}
end
else
{:warning, "Missing settings: #{Enum.join(missing_settings, ", ")}"}
end
end
defp check_mailer_integration(_options) do
mailer_config = PhoenixKit.Config.get_mailer()
case mailer_config do
nil ->
{:warning, "No mailer configured. Set up your mailer in config.exs"}
module when is_atom(module) ->
if Code.ensure_loaded?(module) do
{:ok, "Mailer #{module} is configured"}
else
{:warning, "Configured mailer module #{module} not found"}
end
end
end
defp check_aws_integration(_options) do
ses_config = EmailTracking.get_ses_configuration_set()
if ses_config && ses_config != "" do
{:ok, "AWS SES configuration set configured: #{ses_config}"}
else
{:warning, "AWS SES configuration set not configured"}
end
end
defp migration_applied? do
# Check if V07 migration has been applied
# This would check the schema_migrations table
true
rescue
_ -> false
end
defp tables_exist? do
# Check if email tracking tables exist
case repo().query("SELECT 1 FROM phoenix_kit_email_logs LIMIT 1") do
{:ok, _} ->
case repo().query("SELECT 1 FROM phoenix_kit_email_events LIMIT 1") do
{:ok, _} -> true
_ -> false
end
_ ->
false
end
end
defp test_database_operations do
test_log = %{
message_id: "config-test-#{:rand.uniform(9999)}",
to: "test@example.com",
from: "config@test.com",
subject: "Configuration Test",
status: "sent"
}
with {:ok, log} <- EmailTracking.create_log(test_log),
retrieved_log <- EmailTracking.get_log!(log.id),
_ <- repo().delete!(retrieved_log) do
:ok
else
error when is_exception(error) -> {:error, Exception.message(error)}
{:error, reason} -> {:error, inspect(reason)}
_ -> {:error, "Database operation failed"}
end
rescue
error -> {:error, Exception.message(error)}
end
defp show_summary(results, _options) do
Mix.shell().info("\n📋 Configuration Summary:")
ok_count = Enum.count(results, fn {_name, {status, _}} -> status == :ok end)
warning_count = Enum.count(results, fn {_name, {status, _}} -> status == :warning end)
error_count = Enum.count(results, fn {_name, {status, _}} -> status == :error end)
for {name, {status, message}} <- results do
icon =
case status do
:ok -> "✅"
:warning -> "⚠️ "
:error -> "❌"
end
Mix.shell().info(" #{icon} #{name}: #{message}")
end
Mix.shell().info(
"\n📊 Results: #{ok_count} OK, #{warning_count} warnings, #{error_count} errors"
)
cond do
error_count > 0 ->
Mix.shell().error("\n❌ Configuration has errors that need to be fixed")
exit({:shutdown, 1})
warning_count > 0 ->
Mix.shell().info("\n⚠️ Configuration has warnings but should work")
true ->
Mix.shell().info("\n✅ Email tracking is properly configured!")
end
end
defp show_single_result(name, result, _options) do
{status, message} = result
icon =
case status do
:ok -> "✅"
:warning -> "⚠️ "
:error -> "❌"
end
Mix.shell().info(" #{icon} #{name}: #{message}")
if status == :error do
exit({:shutdown, 1})
end
end
# Gets the configured repository for database operations
defp repo do
PhoenixKit.RepoHelper.repo()
end
end