mobilizon/lib/web/email/member.ex

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