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 @@
<.link navigate={~p"/messages/#{message}"}>Show
- <.link patch={~p"/messages/#{message}/edit"}>Edit <:action :let={{id, message}}> <.link @@ -35,7 +34,7 @@ <.modal - :if={@live_action in [:new, :edit]} + :if={@live_action in [:new]} id="message-modal" show on_cancel={JS.patch(~p"/messages")} diff --git a/lib/send_it_web/live/message_live/show.html.heex b/lib/send_it_web/live/message_live/show.html.heex index d8b4102..0f238ab 100644 --- a/lib/send_it_web/live/message_live/show.html.heex +++ b/lib/send_it_web/live/message_live/show.html.heex @@ -1,11 +1,6 @@ <.header> Message <%= @message.id %> <:subtitle>This is a message record from your database. - <:actions> - <.link patch={~p"/messages/#{@message}/show/edit"} phx-click={JS.push_focus()}> - <.button>Edit message - - <.list> diff --git a/lib/send_it_web/router.ex b/lib/send_it_web/router.ex index 71a3d10..4de3de6 100644 --- a/lib/send_it_web/router.ex +++ b/lib/send_it_web/router.ex @@ -68,10 +68,7 @@ defmodule SendItWeb.Router do on_mount: [{SendItWeb.UserAuth, :ensure_authenticated}] do live "/messages", MessageLive.Index, :index live "/messages/new", MessageLive.Index, :new - live "/messages/:id/edit", MessageLive.Index, :edit - live "/messages/:id", MessageLive.Show, :show - live "/messages/:id/show/edit", MessageLive.Show, :edit live "/users/settings", UserSettingsLive, :edit live "/users/settings/confirm_email/:token", UserSettingsLive, :confirm_email