Packages

phoenix_kit

1.7.52
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 modules emails application_integration.ex
Raw

lib/modules/emails/application_integration.ex

defmodule PhoenixKit.Modules.Emails.ApplicationIntegration do
@moduledoc """
Helpers for integrating PhoenixKit Email Tracking into parent applications.
This module provides convenient functions for adding email system
to your Phoenix application's supervision tree.
## Quick Integration
The simplest way to add email system:
# In lib/your_app/application.ex
def start(_type, _args) do
children = [
# ... your processes
] ++ PhoenixKit.Modules.Emails.ApplicationIntegration.children()
Supervisor.start_link(children, strategy: :one_for_one)
end
## Conditional Integration
If you want to control when email system starts:
# In lib/your_app/application.ex
def start(_type, _args) do
base_children = [
# ... your main processes
]
children = base_children ++ email_children()
Supervisor.start_link(children, strategy: :one_for_one)
end
defp email_children do
if email_enabled?() do
PhoenixKit.Modules.Emails.ApplicationIntegration.children()
else
[]
end
end
defp email_enabled? do
# Your logic for determining if email system is enabled
System.get_env("EMAIL_TRACKING_ENABLED") == "true"
end
## Advanced Integration
For full control use separate functions:
children = [
# ... your processes
] ++ PhoenixKit.Modules.Emails.ApplicationIntegration.supervisor_children()
"""
alias PhoenixKit.Config.AWS
alias PhoenixKit.Modules.Emails
@doc """
Returns list of child specs for adding to supervision tree.
This is the main function for email system integration.
## Options
- `:supervisor_name` - supervisor process name
- `:start_sqs_worker` - force enable/disable SQS Worker
## Examples
# Basic usage
children = PhoenixKit.Modules.Emails.ApplicationIntegration.children()
# With custom options
children = PhoenixKit.Modules.Emails.ApplicationIntegration.children(
supervisor_name: MyApp.EmailSystemSupervisor,
start_sqs_worker: true
)
"""
def children(opts \\ []) do
if should_start_email_system?(opts) do
[supervisor_child_spec(opts)]
else
[]
end
end
@doc """
Returns child spec for email system supervisor.
## Examples
supervisor_spec = PhoenixKit.Modules.Emails.ApplicationIntegration.supervisor_child_spec()
"""
def supervisor_child_spec(opts \\ []) do
supervisor_name = Keyword.get(opts, :supervisor_name, PhoenixKit.Modules.Emails.Supervisor)
%{
id: supervisor_name,
start: {PhoenixKit.Modules.Emails.Supervisor, :start_link, [[name: supervisor_name]]},
type: :supervisor,
restart: :permanent,
shutdown: :infinity
}
end
@doc """
Returns only children for supervisor (without supervisor itself).
Use if you want to add email system processes
to existing supervisor.
## Examples
# In your supervisor module
def init(_opts) do
children = [
# ... your processes
] ++ PhoenixKit.Modules.Emails.ApplicationIntegration.supervisor_children()
Supervisor.init(children, strategy: :one_for_one)
end
"""
def supervisor_children(opts \\ []) do
if should_start_email_system?(opts) do
build_worker_children(opts)
else
[]
end
end
@doc """
Checks if system is ready to start email system.
## Examples
iex> PhoenixKit.Modules.Emails.ApplicationIntegration.ready_for_email_system?()
true
iex> PhoenixKit.Modules.Emails.ApplicationIntegration.ready_for_email_system?()
{:error, :email_disabled}
"""
def ready_for_email_system? do
cond do
not Emails.enabled?() ->
{:error, :email_disabled}
not Emails.sqs_polling_enabled?() ->
{:error, :sqs_polling_disabled}
not has_valid_sqs_configuration?() ->
{:error, :invalid_sqs_configuration}
not has_aws_credentials?() ->
{:error, :missing_aws_credentials}
true ->
true
end
end
@doc """
Performs pre-flight checks for email system system.
Returns detailed report on system readiness.
## Examples
iex> PhoenixKit.Modules.Emails.ApplicationIntegration.preflight_check()
%{
status: :ready,
checks: %{
email_enabled: true,
sqs_polling_enabled: true,
sqs_configuration: true,
aws_credentials: true
}
}
"""
def preflight_check do
checks = %{
email_enabled: Emails.enabled?(),
sqs_polling_enabled: Emails.sqs_polling_enabled?(),
sqs_configuration: has_valid_sqs_configuration?(),
aws_credentials: has_aws_credentials?(),
dependencies_loaded: dependencies_loaded?()
}
status =
if Enum.all?(checks, fn {_key, value} -> value end) do
:ready
else
:not_ready
end
%{
status: status,
checks: checks,
issues: get_issues(checks)
}
end
@doc """
Creates initial configuration for email system.
Useful for initializing system with basic settings.
## Examples
PhoenixKit.Modules.Emails.ApplicationIntegration.initialize_configuration()
"""
def initialize_configuration do
# Create basic settings if they do not exist
default_settings = [
{"email_enabled", "true"},
{"email_save_body", "false"},
{"email_ses_events", "true"},
{"email_retention_days", "90"},
{"email_sampling_rate", "100"},
{"sqs_polling_enabled", "false"},
{"sqs_polling_interval_ms", "5000"},
{"sqs_max_messages_per_poll", "10"},
{"sqs_visibility_timeout", "300"},
{"aws_region", AWS.region()},
{"from_email", get_config_or_default(:from_email, "noreply@localhost")},
{"from_name", get_config_or_default(:from_name, "PhoenixKit")}
]
Enum.each(default_settings, fn {key, default_value} ->
case PhoenixKit.Settings.get_setting(key) do
nil ->
PhoenixKit.Settings.update_setting_with_module(
key,
default_value,
"email_system"
)
_ ->
:already_exists
end
end)
end
## --- Private Functions ---
# Get configuration value or use default
defp get_config_or_default(key, default) do
case PhoenixKit.Config.get(key) do
{:ok, value} -> value
_ -> default
end
end
# Determines whether email system should start
defp should_start_email_system?(opts) do
force_start = Keyword.get(opts, :start_sqs_worker, nil)
case force_start do
true -> true
false -> false
nil -> Emails.enabled?() and Emails.sqs_polling_enabled?()
end
end
# Builds list of worker children
defp build_worker_children(opts) do
children = []
# Add SQS Worker
children =
if should_start_sqs_worker?(opts) do
[build_sqs_worker_child_spec() | children]
else
children
end
# In the future, other workers can be added:
# - Metrics collector
# - Archiver worker
# - Cleanup scheduler
children
end
# Determines whether SQS Worker should start
defp should_start_sqs_worker?(opts) do
force_start = Keyword.get(opts, :start_sqs_worker, nil)
case force_start do
true ->
true
false ->
false
nil ->
Emails.sqs_polling_enabled?() and has_valid_sqs_configuration?()
end
end
# Creates child spec for SQS Worker
defp build_sqs_worker_child_spec do
%{
id: PhoenixKit.Modules.Emails.SQSWorker,
start: {PhoenixKit.Modules.Emails.SQSWorker, :start_link, [[]]},
type: :worker,
restart: :permanent,
shutdown: 10_000
}
end
# Checks SQS configuration validity
defp has_valid_sqs_configuration? do
sqs_config = Emails.get_sqs_config()
not is_nil(sqs_config.queue_url) and
sqs_config.queue_url != "" and
not is_nil(sqs_config.aws_region) and
sqs_config.aws_region != ""
end
# Checks for AWS credentials (Settings DB or environment variables)
defp has_aws_credentials? do
# Use Emails.aws_configured?() which checks Settings DB first, then ENV fallback
Emails.aws_configured?()
end
# Checks if required dependencies are loaded
defp dependencies_loaded? do
# Check that ExAws modules are available
Code.ensure_loaded?(ExAws) and
Code.ensure_loaded?(ExAws.SQS) and
Code.ensure_loaded?(Jason)
rescue
_ -> false
end
# Returns list of issues based on checks
defp get_issues(checks) do
checks
|> Enum.filter(fn {_key, value} -> not value end)
|> Enum.map(fn {key, _value} -> key end)
end
end