defmodule MvWeb.Emails.JoinEmail do @moduledoc """ Shared build/deliver skeleton for the join-flow emails (confirmation, already-a-member, already-pending). Each concrete join email supplies only its subject, template, and any email-specific assigns; this module builds the Swoosh email with the unified layout and delivers it via `Mailer.deliver/2` with `Mailer.smtp_config/0`, preserving the `{:ok, email}` / `{:error, reason}` contract. """ use Phoenix.Swoosh, view: MvWeb.EmailsView, layout: {MvWeb.EmailLayoutView, "layout.html"} import Swoosh.Email alias Mv.Mailer @doc """ Builds and delivers a join-flow email. - `email_address` - recipient address - `template` - the EmailsView template to render (e.g. `"join_confirmation.html"`) - `subject` - already-translated subject line - `extra_assigns` - email-specific assigns merged on top of the common ones (`subject`, `app_name`, `locale`) Returns `{:ok, email}` on success, `{:error, reason}` on delivery failure. """ @spec deliver(String.t(), String.t(), String.t(), map()) :: {:ok, Swoosh.Email.t()} | {:error, term()} def deliver(email_address, template, subject, extra_assigns \\ %{}) when is_binary(email_address) and is_binary(template) and is_binary(subject) do assigns = Map.merge( %{ subject: subject, app_name: Mailer.mail_from() |> elem(0), locale: Gettext.get_locale(MvWeb.Gettext) }, extra_assigns ) email = new() |> from(Mailer.mail_from()) |> to(email_address) |> subject(subject) |> put_view(MvWeb.EmailsView) |> render_body(template, assigns) Mailer.deliver(email, Mailer.smtp_config()) end end