diff --git a/lib/send_it/marketing.ex b/lib/send_it/marketing.ex index a7c5d06..7d8e281 100644 --- a/lib/send_it/marketing.ex +++ b/lib/send_it/marketing.ex @@ -6,8 +6,7 @@ defmodule SendIt.Marketing do import Ecto.Query, warn: false alias SendIt.Repo - alias SendIt.Marketing.Contact - alias SendIt.Marketing.Message + alias SendIt.Marketing.{Contact, Message, MessageNotifier} @doc """ Returns the list of contacts. @@ -146,10 +145,25 @@ defmodule SendIt.Marketing do """ def create_message(attrs \\ %{}) do %Message{} - |> Message.changeset(attrs) + |> change_message(attrs) |> Repo.insert() end + @doc """ + Delivers the given message to the message's contacts list + + ## Examples + + iex> deliver_message(message) + {:ok, %{to: ..., body: ...}} + + """ + def deliver_message(%Message{} = message) do + message + |> Repo.preload(:contacts) + |> MessageNotifier.deliver_message() + end + @doc """ Updates a message. @@ -164,7 +178,7 @@ defmodule SendIt.Marketing do """ def update_message(%Message{} = message, attrs) do message - |> Message.changeset(attrs) + |> change_message(attrs) |> Repo.update() end @@ -194,6 +208,10 @@ defmodule SendIt.Marketing do """ def change_message(%Message{} = message, attrs \\ %{}) do - Message.changeset(message, attrs) + contacts = list_contacts() + + message + |> Message.changeset(attrs) + |> Ecto.Changeset.put_assoc(:contacts, contacts) end end diff --git a/lib/send_it/marketing/message_notifier.ex b/lib/send_it/marketing/message_notifier.ex new file mode 100644 index 0000000..f4a7279 --- /dev/null +++ b/lib/send_it/marketing/message_notifier.ex @@ -0,0 +1,51 @@ +defmodule SendIt.Marketing.MessageNotifier do + use SendItWeb, :html + + require Logger + import Swoosh.Email + + alias SendIt.Mailer + + @from_name "Port Townsend Roasting Co." + @from_email "newsletter@ptcoffee.com" + + def deliver_message(message) do + message.contacts + |> format_recipients() + |> dbg() + |> deliver(message.subject, message.content) + end + + defp deliver(recipients, subject, body) do + email = + new( + to: recipients, + from: {@from_name, @from_email}, + subject: subject, + html_body: + body + |> Phoenix.HTML.html_escape() + |> Phoenix.HTML.safe_to_string() + ) + |> put_provider_option(:recipient_vars, format_recipient_vars(recipients)) + + case Mailer.deliver(email) do + {:ok, _} -> + {:ok, email} + + {:error, reason} -> + Logger.warning("Sending email failed: #{inspect(reason)}") + {:error, reason} + end + end + + defp format_recipients(recipients) do + Enum.map(recipients, &{&1.name, &1.email}) + end + + defp format_recipient_vars(recipients) do + Enum.reduce(recipients, %{}, fn {name, email}, acc -> + Map.put_new(acc, email, %{name: name}) + end) + end +end diff --git a/lib/send_it_web/live/message_live/form_component.ex b/lib/send_it_web/live/message_live/form_component.ex index 11871d1..62096d7 100644 --- a/lib/send_it_web/live/message_live/form_component.ex +++ b/lib/send_it_web/live/message_live/form_component.ex @@ -20,7 +20,7 @@ defmodule SendItWeb.MessageLive.FormComponent do phx-submit="save" > <.input field={@form[:subject]} type="text" label="Subject" /> - <.input field={@form[:content]} type="text" label="Content" /> + <.input field={@form[:content]} type="textarea" label="Content" /> <:actions> <.button phx-disable-with="Saving...">Save Message @@ -49,24 +49,11 @@ defmodule SendItWeb.MessageLive.FormComponent do save_message(socket, socket.assigns.action, message_params) end - defp save_message(socket, :edit, message_params) do - case Marketing.update_message(socket.assigns.message, message_params) do - {:ok, message} -> - notify_parent({:saved, message}) - - {:noreply, - socket - |> put_flash(:info, "Message updated successfully") - |> push_patch(to: socket.assigns.patch)} - - {:error, %Ecto.Changeset{} = changeset} -> - {:noreply, assign(socket, form: to_form(changeset))} - end - end - defp save_message(socket, :new, message_params) do case Marketing.create_message(message_params) do {:ok, message} -> + {:ok, _email} = Marketing.deliver_message(message) + notify_parent({:saved, message}) {:noreply, diff --git a/lib/send_it_web/live/message_live/index.html.heex b/lib/send_it_web/live/message_live/index.html.heex index 02febaa..f766c7b 100644 --- a/lib/send_it_web/live/message_live/index.html.heex +++ b/lib/send_it_web/live/message_live/index.html.heex @@ -22,7 +22,6 @@