128 lines
3.5 KiB
Elixir
128 lines
3.5 KiB
Elixir
defmodule Mobilizon.Web.Email.Member do
|
|
@moduledoc """
|
|
Handles emails sent about group members.
|
|
"""
|
|
use Phoenix.Swoosh, view: Mobilizon.Web.EmailView
|
|
|
|
import Mobilizon.Web.Gettext
|
|
|
|
alias Mobilizon.{Actors, Users}
|
|
alias Mobilizon.Actors.{Actor, Member}
|
|
alias Mobilizon.Users.User
|
|
alias Mobilizon.Web.Email
|
|
|
|
@doc """
|
|
Send emails to local user
|
|
"""
|
|
@spec send_invite_to_user(Member.t()) :: :ok
|
|
def send_invite_to_user(%Member{actor: %Actor{user_id: nil}}), do: :ok
|
|
|
|
def send_invite_to_user(
|
|
%Member{actor: %Actor{user_id: user_id}, parent: %Actor{} = group, role: :invited} =
|
|
member
|
|
) do
|
|
with %User{email: email} = user <- Users.get_user!(user_id) do
|
|
locale = Map.get(user, :locale, "en")
|
|
Gettext.put_locale(locale)
|
|
%Actor{name: invited_by_name} = inviter = Actors.get_actor(member.invited_by_id)
|
|
|
|
subject =
|
|
gettext(
|
|
"You have been invited by %{inviter} to join group %{group}",
|
|
inviter: invited_by_name,
|
|
group: group.name
|
|
)
|
|
|
|
[to: email, subject: subject]
|
|
|> Email.base_email()
|
|
|> render_body(:group_invite, %{
|
|
locale: locale,
|
|
inviter: inviter,
|
|
group: group,
|
|
subject: subject
|
|
})
|
|
|> Email.Mailer.send_email()
|
|
|
|
:ok
|
|
end
|
|
end
|
|
|
|
# Only send notification to local members
|
|
def send_notification_to_approved_member(%Member{actor: %Actor{user_id: nil}}), do: :ok
|
|
|
|
def send_notification_to_approved_member(%Member{
|
|
actor: %Actor{user_id: user_id},
|
|
parent: %Actor{} = group
|
|
}) do
|
|
with %User{email: email, locale: locale} <- Users.get_user!(user_id) do
|
|
Gettext.put_locale(locale)
|
|
|
|
subject =
|
|
gettext(
|
|
"Your membership request for group %{group} has been approved",
|
|
group: Actor.display_name(group)
|
|
)
|
|
|
|
[to: email, subject: subject]
|
|
|> Email.base_email()
|
|
|> render_body(:group_membership_approval, %{locale: locale, group: group, subject: subject})
|
|
|> Email.Mailer.send_email()
|
|
|
|
:ok
|
|
end
|
|
end
|
|
|
|
# Only send notification to local members
|
|
def send_notification_to_removed_member(%Member{actor: %Actor{user_id: nil}}), do: :ok
|
|
|
|
# Member rejection
|
|
def send_notification_to_removed_member(%Member{
|
|
actor: %Actor{user_id: user_id},
|
|
parent: %Actor{} = group,
|
|
role: :not_approved
|
|
}) do
|
|
with %User{email: email, locale: locale} <- Users.get_user!(user_id) do
|
|
Gettext.put_locale(locale)
|
|
|
|
subject =
|
|
gettext(
|
|
"Your membership request for group %{group} has been rejected",
|
|
group: Actor.display_name(group)
|
|
)
|
|
|
|
[to: email, subject: subject]
|
|
|> Email.base_email()
|
|
|> render_body(:group_membership_rejection, %{
|
|
locale: locale,
|
|
group: group,
|
|
subject: subject
|
|
})
|
|
|> Email.Mailer.send_email()
|
|
|
|
:ok
|
|
end
|
|
end
|
|
|
|
def send_notification_to_removed_member(%Member{
|
|
actor: %Actor{user_id: user_id},
|
|
parent: %Actor{} = group
|
|
}) do
|
|
with %User{email: email, locale: locale} <- Users.get_user!(user_id) do
|
|
Gettext.put_locale(locale)
|
|
|
|
subject =
|
|
gettext(
|
|
"You have been removed from group %{group}",
|
|
group: Actor.display_name(group)
|
|
)
|
|
|
|
[to: email, subject: subject]
|
|
|> Email.base_email()
|
|
|> render_body(:group_member_removal, %{locale: locale, group: group, subject: subject})
|
|
|> Email.Mailer.send_email()
|
|
|
|
:ok
|
|
end
|
|
end
|
|
end
|