namespace email settings keys per adapter
All checks were successful
deploy / deploy (push) Successful in 57s

Settings keys like api_key were shared across providers, so switching
from e.g. Postmark to SendGrid showed the old API key. Now each
adapter gets its own namespaced key (email_postmark_api_key, etc.)
so credentials persist independently and switching back pre-fills
previously saved values.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jamey
2026-02-21 19:57:23 +00:00
parent 366a1e6a48
commit 194fec8240
6 changed files with 72 additions and 34 deletions

View File

@@ -40,10 +40,12 @@ defmodule Berrypod.Mailer do
adapter_info ->
config =
for field <- adapter_info.fields, into: %{} do
settings_key = Adapters.settings_key(adapter_info.key, field.key)
value =
case field.type do
:secret -> Settings.secret_hint("email_#{field.key}")
_ -> Settings.get_setting("email_#{field.key}")
:secret -> Settings.secret_hint(settings_key)
_ -> Settings.get_setting(settings_key)
end
{field.key, value}
@@ -114,7 +116,7 @@ defmodule Berrypod.Mailer do
opts =
for field <- adapter_info.fields, reduce: [] do
acc ->
settings_key = "email_#{field.key}"
settings_key = Adapters.settings_key(adapter_info.key, field.key)
value =
case field.type do

View File

@@ -59,6 +59,17 @@ defmodule Berrypod.Mailer.Adapters do
%Field{key: "secret", label: "Secret key", type: :secret, required: true}
]
},
%Adapter{
key: "mailersend",
name: "MailerSend",
module: Swoosh.Adapters.MailerSend,
description: "Generous free tier, good analytics dashboard.",
tags: ["All email", "EU option"],
url: "https://www.mailersend.com",
fields: [
%Field{key: "api_key", label: "API key", type: :secret, required: true}
]
},
%Adapter{
key: "resend",
name: "Resend",
@@ -126,15 +137,18 @@ defmodule Berrypod.Mailer.Adapters do
Enum.find(@adapters, &(&1.key == key))
end
@doc "Returns the settings keys for an adapter's fields (prefixed with `email_`)."
def field_keys(%{fields: fields}) do
Enum.map(fields, &"email_#{&1.key}")
@doc "Returns the namespaced settings key for an adapter field."
def settings_key(adapter_key, field_key) do
"email_#{adapter_key}_#{field_key}"
end
@doc "Returns the settings keys for an adapter's fields."
def field_keys(%{key: adapter_key, fields: fields}) do
Enum.map(fields, &settings_key(adapter_key, &1.key))
end
@doc "Returns all possible settings keys across all adapters."
def all_field_keys do
@adapters
|> Enum.flat_map(&field_keys/1)
|> Enum.uniq()
Enum.flat_map(@adapters, &field_keys/1)
end
end