version chapril de mobilizon
https://mobilizon.chapril.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
4.2 KiB
163 lines
4.2 KiB
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), |
|
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), |
|
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
|
|
|