mobilizon/lib/web/email/participation.ex
Thomas Citharel 9e6b232a78
feat: add links to cancel anonymous participations in emails
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2023-12-01 11:29:53 +01:00

166 lines
4.2 KiB
Elixir

defmodule Mobilizon.Web.Email.Participation do
@moduledoc """
Handles emails sent about participation.
"""
use Phoenix.Swoosh, view: Mobilizon.Web.EmailView
import Mobilizon.Web.Gettext
alias Mobilizon.Actors.Actor
alias Mobilizon.{Config, Events, Users}
alias Mobilizon.Events.{Event, Participant}
alias Mobilizon.Users.User
alias Mobilizon.Web.Email
alias Mobilizon.Web.JsonLD.ObjectView
@doc """
Send participation emails to local user
If the actor is anonymous, use information in metadata
"""
def send_emails_to_local_user(
%Participant{actor: %Actor{user_id: nil, id: actor_id} = _actor} = participation
) do
if actor_id == Config.anonymous_actor_id() do
%{email: email, locale: locale} = Map.get(participation, :metadata)
locale = locale || "en"
email
|> participation_updated(participation, locale)
|> Email.Mailer.send_email()
end
:ok
end
def send_emails_to_local_user(
%Participant{actor: %Actor{user_id: user_id} = _actor} = participation
) do
with %User{locale: locale} = user <- Users.get_user!(user_id) do
user
|> participation_updated(participation, locale)
|> Email.Mailer.send_email()
:ok
end
end
@spec participation_updated(String.t() | User.t(), Participant.t(), String.t()) ::
Swoosh.Email.t()
def participation_updated(user, participant, locale \\ "en")
def participation_updated(
%User{email: email},
%Participant{} = participant,
locale
),
do: participation_updated(email, participant, locale)
def participation_updated(
email,
%Participant{event: event, role: :rejected} = participant,
locale
) do
Gettext.put_locale(locale)
subject =
gettext(
"Your participation to event %{title} has been rejected",
title: event.title
)
[to: email, subject: subject]
|> Email.base_email()
|> render_body(:event_participation_rejected, %{
locale: locale,
event: event,
jsonLDMetadata: json_ld(participant),
subject: subject
})
end
def participation_updated(
email,
%Participant{event: %Event{join_options: :free} = event, role: :participant} =
participant,
locale
) do
Gettext.put_locale(locale)
subject =
gettext(
"Your participation to event %{title} has been confirmed",
title: event.title
)
[to: email, subject: subject]
|> Email.base_email()
|> render_body(:event_participation_confirmed, %{
locale: locale,
event: event,
jsonLDMetadata: json_ld(participant),
participant: participant,
subject: subject
})
end
def participation_updated(
email,
%Participant{event: event, role: :participant} = participant,
locale
) do
Gettext.put_locale(locale)
subject =
gettext(
"Your participation to event %{title} has been approved",
title: event.title
)
[to: email, subject: subject]
|> Email.base_email()
|> Email.add_event_attachment(event)
|> render_body(:event_participation_approved, %{
locale: locale,
event: event,
jsonLDMetadata: json_ld(participant),
participant: participant,
subject: subject
})
end
@spec anonymous_participation_confirmation(String.t(), Participant.t(), String.t()) ::
Swoosh.Email.t()
def anonymous_participation_confirmation(
email,
%Participant{event: event, role: :not_confirmed} = participant,
locale \\ "en"
) do
Gettext.put_locale(locale)
subject =
gettext(
"Confirm your participation to event %{title}",
title: event.title
)
[to: email, subject: subject]
|> Email.base_email()
|> render_body(:anonymous_participation_confirmation, %{
locale: locale,
event: event,
jsonLDMetadata: json_ld(participant),
participant: participant,
subject: subject
})
end
defp json_ld(participant) do
event = Events.get_event_with_preload!(participant.event_id)
"participation.json"
|> ObjectView.render(%{participant: %Participant{participant | event: event}})
|> Jason.encode!()
end
end