Add "status" notification type

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
marcin mikołajczak 2022-04-25 12:39:36 +02:00
parent 8517bc18aa
commit 9423052e92
7 changed files with 92 additions and 6 deletions

View File

@ -73,6 +73,7 @@ def unread_notifications_count(%User{id: user_id}) do
pleroma:report pleroma:report
reblog reblog
poll poll
status
} }
def changeset(%Notification{} = notification, attrs) do def changeset(%Notification{} = notification, attrs) do
@ -397,11 +398,18 @@ defp do_create_notifications(%Activity{} = activity, options) do
{enabled_receivers, disabled_receivers} = get_notified_from_activity(activity) {enabled_receivers, disabled_receivers} = get_notified_from_activity(activity)
potential_receivers = enabled_receivers ++ disabled_receivers potential_receivers = enabled_receivers ++ disabled_receivers
{enabled_subscribers, disabled_subscribers} = get_notified_subscribers_from_activity(activity)
potential_subscribers = (enabled_subscribers ++ disabled_subscribers) -- potential_receivers
notifications = notifications =
Enum.map(potential_receivers, fn user -> (Enum.map(potential_receivers, fn user ->
do_send = do_send && user in enabled_receivers do_send = do_send && user in enabled_receivers
create_notification(activity, user, do_send: do_send) create_notification(activity, user, do_send: do_send)
end) end) ++
Enum.map(potential_subscribers, fn user ->
do_send = do_send && user in enabled_subscribers
create_notification(activity, user, do_send: do_send, type: "status")
end))
|> Enum.reject(&is_nil/1) |> Enum.reject(&is_nil/1)
{:ok, notifications} {:ok, notifications}
@ -533,6 +541,27 @@ def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, lo
def get_notified_from_activity(_, _local_only), do: {[], []} def get_notified_from_activity(_, _local_only), do: {[], []}
def get_notified_subscribers_from_activity(activity, local_only \\ true)
def get_notified_subscribers_from_activity(
%Activity{data: %{"type" => "Create"}} = activity,
local_only
) do
notification_enabled_ap_ids =
[]
|> Utils.maybe_notify_subscribers(activity)
potential_receivers =
User.get_users_from_set(notification_enabled_ap_ids, local_only: local_only)
notification_enabled_users =
Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end)
{notification_enabled_users, potential_receivers -- notification_enabled_users}
end
def get_notified_subscribers_from_activity(_, _), do: {[], []}
# For some activities, only notify the author of the object # For some activities, only notify the author of the object
def get_potential_receiver_ap_ids(%{data: %{"type" => type, "object" => object_id}}) def get_potential_receiver_ap_ids(%{data: %{"type" => type, "object" => object_id}})
when type in ~w{Like Announce EmojiReact} do when type in ~w{Like Announce EmojiReact} do
@ -557,7 +586,6 @@ def get_potential_receiver_ap_ids(activity) do
[] []
|> Utils.maybe_notify_to_recipients(activity) |> Utils.maybe_notify_to_recipients(activity)
|> Utils.maybe_notify_mentioned_recipients(activity) |> Utils.maybe_notify_mentioned_recipients(activity)
|> Utils.maybe_notify_subscribers(activity)
|> Utils.maybe_notify_followers(activity) |> Utils.maybe_notify_followers(activity)
|> Enum.uniq() |> Enum.uniq()
end end

View File

@ -196,7 +196,8 @@ defp notification_type do
"pleroma:report", "pleroma:report",
"move", "move",
"follow_request", "follow_request",
"poll" "poll",
"status"
], ],
description: """ description: """
The type of event that resulted in the notification. The type of event that resulted in the notification.
@ -210,6 +211,7 @@ defp notification_type do
- `pleroma:emoji_reaction` - Someone reacted with emoji to your status - `pleroma:emoji_reaction` - Someone reacted with emoji to your status
- `pleroma:chat_mention` - Someone mentioned you in a chat message - `pleroma:chat_mention` - Someone mentioned you in a chat message
- `pleroma:report` - Someone was reported - `pleroma:report` - Someone was reported
- `status` - Someone you are subscribed to created a status
""" """
} }
end end

View File

@ -51,6 +51,7 @@ def index(conn, %{account_id: account_id} = params) do
move move
pleroma:emoji_reaction pleroma:emoji_reaction
poll poll
status
} }
def index(%{assigns: %{user: user}} = conn, params) do def index(%{assigns: %{user: user}} = conn, params) do
params = params =

View File

@ -103,6 +103,9 @@ def render(
"mention" -> "mention" ->
put_status(response, activity, reading_user, status_render_opts) put_status(response, activity, reading_user, status_render_opts)
"status" ->
put_status(response, activity, reading_user, status_render_opts)
"favourite" -> "favourite" ->
put_status(response, parent_activity_fn.(), reading_user, status_render_opts) put_status(response, parent_activity_fn.(), reading_user, status_render_opts)

View File

@ -183,6 +183,7 @@ def format_title(%{activity: %{data: %{"directMessage" => true}}}, _mastodon_typ
def format_title(%{type: type}, mastodon_type) do def format_title(%{type: type}, mastodon_type) do
case mastodon_type || type do case mastodon_type || type do
"mention" -> "New Mention" "mention" -> "New Mention"
"status" -> "New Status"
"follow" -> "New Follower" "follow" -> "New Follower"
"follow_request" -> "New Follow Request" "follow_request" -> "New Follow Request"
"reblog" -> "New Repeat" "reblog" -> "New Repeat"

View File

@ -0,0 +1,50 @@
defmodule Pleroma.Repo.Migrations.AddStatusToNotificationsEnum do
use Ecto.Migration
@disable_ddl_transaction true
def up do
"""
alter type notification_type add value 'status'
"""
|> execute()
end
def down do
alter table(:notifications) do
modify(:type, :string)
end
"""
delete from notifications where type = 'status'
"""
|> execute()
"""
drop type if exists notification_type
"""
|> execute()
"""
create type notification_type as enum (
'follow',
'follow_request',
'mention',
'move',
'pleroma:emoji_reaction',
'pleroma:chat_mention',
'reblog',
'favourite',
'pleroma:report',
'poll
)
"""
|> execute()
"""
alter table notifications
alter column type type notification_type using (type::notification_type)
"""
|> execute()
end
end

View File

@ -104,6 +104,7 @@ test "it creates a notification for subscribed users" do
{:ok, [notification]} = Notification.create_notifications(status) {:ok, [notification]} = Notification.create_notifications(status)
assert notification.user_id == subscriber.id assert notification.user_id == subscriber.id
assert notification.type == "status"
end end
test "does not create a notification for subscribed users if status is a reply" do test "does not create a notification for subscribed users if status is a reply" do