Skip to content

Commit

Permalink
Send mail to facilitators when they are invited to manage an event
Browse files Browse the repository at this point in the history
  • Loading branch information
alxlion committed Nov 24, 2023
1 parent e54f27c commit 602c574
Show file tree
Hide file tree
Showing 10 changed files with 624 additions and 409 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
- Add pinned messages (#62) (@haruncurak)
- Add reset password feature
- Add Postmark adapter
- Add the ability to send mail to facilitators invited to manage an event
- Allow navigation within presenter window (#63) (@railsmechanic)
- Security updates

Expand Down
12 changes: 12 additions & 0 deletions lib/claper/accounts/leader_notifier.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
defmodule Claper.Accounts.LeaderNotifier do
alias Claper.Mailer

def deliver_event_invitation(event_name, email, url) do
e = ClaperWeb.Notifiers.LeaderNotifier.event_invitation(event_name, email, url)

with {:ok, _metadata} <- Mailer.deliver(e) do
{:ok, email}
end
end

end
24 changes: 22 additions & 2 deletions lib/claper_web/live/event_live/event_form_component.ex
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
|> Map.put("user_id", socket.assigns.current_user.id)
) do
{:ok, event} ->
with e <- Events.get_event!(event.uuid, [:presentation_file]) do
with e <- Events.get_event!(event.uuid, [:presentation_file, :leaders]) do
Task.Supervisor.async_nolink(Claper.TaskSupervisor, fn ->
Claper.Tasks.Converter.convert(
socket.assigns.current_user.id,
Expand All @@ -171,6 +171,10 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
e.presentation_file.id
)
end)

Enum.each(e.leaders, fn leader ->
Claper.Accounts.LeaderNotifier.deliver_event_invitation(e.name, leader.email, Routes.event_index_url(socket, :index))
end)
end

{:noreply,
Expand All @@ -188,9 +192,11 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
socket.assigns.event,
event_params
) do
{:ok, _event} ->
{:ok, event} ->
handle_file_conversion(socket, hash, ext)

send_email_to_leaders(socket, event)

{:noreply,
socket
|> put_flash(:info, gettext("Updated successfully"))
Expand Down Expand Up @@ -225,6 +231,20 @@ defmodule ClaperWeb.EventLive.EventFormComponent do
Application.get_env(:claper, :storage_dir)
end

defp send_email_to_leaders(socket, event) do
with e <- Events.get_event!(event.uuid, [:leaders]) do
# Get the leaders before the update
previous_leaders = socket.assigns.event.leaders

Enum.each(e.leaders, fn leader ->
# Only send email if leader was not present before the update
unless Enum.member?(previous_leaders, leader) do
Claper.Accounts.LeaderNotifier.deliver_event_invitation(e.name, leader.email, Routes.event_index_url(socket, :index))
end
end)
end
end

def error_to_string(:too_large), do: gettext("Your file is too large")
def error_to_string(:not_accepted), do: gettext("You have selected an incorrect file type")
def error_to_string(:external_client_failure), do: gettext("Upload failed")
Expand Down
15 changes: 15 additions & 0 deletions lib/claper_web/notifiers/leader_notifier.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
defmodule ClaperWeb.Notifiers.LeaderNotifier do
use Phoenix.Swoosh, view: ClaperWeb.LeaderNotifierView, layout: {ClaperWeb.LayoutView, :email}
import ClaperWeb.Gettext

def event_invitation(event_name, email, url) do
new()
|> to(email)
|> from(
{Application.get_env(:claper, :mail) |> Keyword.get(:from_name),
Application.get_env(:claper, :mail) |> Keyword.get(:from)}
)
|> subject(gettext("You have been invited to manage an event"))
|> render_body("invitation.html", %{event_name: event_name, leader_email: email, url: url})
end
end
57 changes: 57 additions & 0 deletions lib/claper_web/templates/leader_notifier/invitation.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<tr>
<td>
<table
width="95%"
border="0"
align="center"
cellpadding="0"
cellspacing="0"
style="max-width:670px;background:#fff; border-radius:3px; text-align:center;-webkit-box-shadow:0 6px 18px 0 rgba(0,0,0,.06);-moz-box-shadow:0 6px 18px 0 rgba(0,0,0,.06);box-shadow:0 6px 18px 0 rgba(0,0,0,.06);"
>
<tr>
<td style="height:40px;">&nbsp;</td>
</tr>
<tr>
<td style="padding:0 35px;">
<h1 style="color:#1e1e2d; font-weight:500; margin:0;font-size:32px;font-family:'Rubik',sans-serif;">
<%= gettext("You have been invited") %>
</h1>
<span style="display:inline-block; vertical-align:middle; margin:29px 0 26px; border-bottom:1px solid #cecece; width:100px;">
</span>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext("Someone invited you to manage the event: %{name}", name: @event_name) %>
</p>
<p style="color:#455056; font-size:15px;line-height:24px; margin:0;">
<%= gettext("To accept the invitation, please login or create an account with this email: %{email}", email: @leader_email) %>
</p>
<a
href={@url}
target="_blank"
style="background:#8611ed;text-decoration:none !important; font-weight:500; margin-top:35px; color:#fff;text-transform:uppercase; font-size:14px;padding:10px 24px;display:inline-block;border-radius:50px;"
>
<%= gettext("Login or create account") %>
</a>
</td>
</tr>
<tr>
<td style="height:20px;">&nbsp;</td>
</tr>
<tr>
<td style="font-size: 0.8em; color: #6C6C6C">
<p class="sub">
<%= gettext(
"If you’re having trouble with the button above, copy and paste the URL below into your web browser"
) %>.
</p>
<p class="sub"><%= @url %></p>
</td>
</tr>
<tr>
<td style="height:40px;">&nbsp;</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style="height:20px;">&nbsp;</td>
</tr>
5 changes: 5 additions & 0 deletions lib/claper_web/views/leader_notifier_view.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
defmodule ClaperWeb.LeaderNotifierView do
use Phoenix.View, root: "lib/claper_web/templates"
import ClaperWeb.Gettext
use Phoenix.HTML
end
Loading

0 comments on commit 602c574

Please sign in to comment.