mobilizon.chapril.org-mobil.../lib/web/email/follow.ex

77 lines
2.2 KiB
Elixir

defmodule Mobilizon.Web.Email.Follow do
@moduledoc """
Handles emails sent about (instance) follow.
"""
use Phoenix.Swoosh, view: Mobilizon.Web.EmailView
import Mobilizon.Web.Gettext
alias Mobilizon.Users
alias Mobilizon.Actors.{Actor, Follower}
alias Mobilizon.Federation.ActivityPub.Relay
alias Mobilizon.Users.User
alias Mobilizon.Web.Email
@doc """
Send follow notification to admins if the followed actor is the relay and the actor follower is an instance
"""
@spec send_notification_to_admins(Follower.t()) :: :ok
def send_notification_to_admins(
%Follower{
approved: false,
actor: %Actor{type: :Application} = follower,
target_actor: %Actor{id: target_actor_id}
} = _follow
) do
relay_actor = Relay.get_actor()
if relay_actor.id == target_actor_id do
Enum.each(Users.list_admins(), fn admin ->
send_notification_to_admin(admin, follower)
end)
end
:ok
end
def send_notification_to_admins(_), do: :ok
defp send_notification_to_admin(
%User{email: email, locale: locale},
%Actor{type: follower_type} = follower
) do
Gettext.put_locale(locale)
subject =
if follower_type == :Application do
# Mastodon instance actor has no name and an username equal to the domain
if is_nil(follower.name) and follower.preferred_username == follower.domain do
gettext(
"Instance %{domain} requests to follow your instance",
domain: follower.domain
)
else
gettext(
"Instance %{name} (%{domain}) requests to follow your instance",
name: follower.name || follower.preferred_username,
domain: follower.domain
)
end
else
gettext(
"%{name} requests to follow your instance",
name: Actor.display_name_and_username(follower)
)
end
[to: email, subject: subject]
|> Email.base_email()
|> render_body(:instance_follow, %{locale: locale, follower: follower, subject: subject})
|> Email.Mailer.send_email()
:ok
end
defp send_notification_to_admin(_, _), do: :ok
end