diff options
9 files changed, 131 insertions, 6 deletions
| diff --git a/changelog.d/status-notification-type.add b/changelog.d/status-notification-type.add new file mode 100644 index 000000000..a6e94fa87 --- /dev/null +++ b/changelog.d/status-notification-type.add @@ -0,0 +1 @@ +Add "status" notification type
\ No newline at end of file diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index cb9bd92b8..4f714b25f 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -73,6 +73,7 @@ defmodule Pleroma.Notification do      pleroma:report      reblog      poll +    status    }    def changeset(%Notification{} = notification, attrs) do @@ -375,10 +376,15 @@ defmodule Pleroma.Notification do    defp do_create_notifications(%Activity{} = activity) do      enabled_receivers = get_notified_from_activity(activity) +    enabled_subscribers = get_notified_subscribers_from_activity(activity) +      notifications = -      Enum.map(enabled_receivers, fn user -> -        create_notification(activity, user) -      end) +      (Enum.map(enabled_receivers, fn user -> +         create_notification(activity, user) +       end) ++ +         Enum.map(enabled_subscribers -- enabled_receivers, fn user -> +           create_notification(activity, user, type: "status") +         end))        |> Enum.reject(&is_nil/1)      {:ok, notifications} @@ -511,7 +517,25 @@ defmodule Pleroma.Notification do      Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end)    end -  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) + +    Enum.filter(potential_receivers, fn u -> u.ap_id in notification_enabled_ap_ids end) +  end + +  def get_notified_subscribers_from_activity(_, _), do: []    # For some activities, only notify the author of the object    def get_potential_receiver_ap_ids(%{data: %{"type" => type, "object" => object_id}}) @@ -554,7 +578,6 @@ defmodule Pleroma.Notification do      []      |> Utils.maybe_notify_to_recipients(activity)      |> Utils.maybe_notify_mentioned_recipients(activity) -    |> Utils.maybe_notify_subscribers(activity)      |> Utils.maybe_notify_followers(activity)      |> Enum.uniq()    end diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex index 757429d12..a79eb8f74 100644 --- a/lib/pleroma/web/api_spec/operations/notification_operation.ex +++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex @@ -202,7 +202,8 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do          "pleroma:report",          "move",          "follow_request", -        "poll" +        "poll", +        "status"        ],        description: """        The type of event that resulted in the notification. @@ -216,6 +217,7 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do        - `pleroma:emoji_reaction` - Someone reacted with emoji to your status        - `pleroma:chat_mention` - Someone mentioned you in a chat message        - `pleroma:report` - Someone was reported +      - `status` - Someone you are subscribed to created a status        """      }    end diff --git a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex index e305aea94..afd83b785 100644 --- a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex @@ -34,6 +34,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationController do        pleroma:emoji_reaction        poll        update +      status      }    # GET /api/v1/notifications diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 2a51f3755..3f2478719 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -108,6 +108,9 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do        "mention" ->          put_status(response, activity, reading_user, status_render_opts) +      "status" -> +        put_status(response, activity, reading_user, status_render_opts) +        "favourite" ->          put_status(response, parent_activity_fn.(), reading_user, status_render_opts) diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index 36f44d8e8..9e68d827b 100644 --- a/lib/pleroma/web/push/impl.ex +++ b/lib/pleroma/web/push/impl.ex @@ -192,6 +192,7 @@ defmodule Pleroma.Web.Push.Impl do    def format_title(%{type: type}, mastodon_type) do      case mastodon_type || type do        "mention" -> "New Mention" +      "status" -> "New Status"        "follow" -> "New Follower"        "follow_request" -> "New Follow Request"        "reblog" -> "New Repeat" diff --git a/priv/repo/migrations/20220319000000_add_status_to_notifications_enum.exs b/priv/repo/migrations/20220319000000_add_status_to_notifications_enum.exs new file mode 100644 index 000000000..c3bc85894 --- /dev/null +++ b/priv/repo/migrations/20220319000000_add_status_to_notifications_enum.exs @@ -0,0 +1,51 @@ +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', +      'update' +    ) +    """ +    |> execute() + +    """ +    alter table notifications +    alter column type type notification_type using (type::notification_type) +    """ +    |> execute() +  end +end diff --git a/test/pleroma/notification_test.exs b/test/pleroma/notification_test.exs index 1dd0c26f7..ecdb32e32 100644 --- a/test/pleroma/notification_test.exs +++ b/test/pleroma/notification_test.exs @@ -112,6 +112,7 @@ defmodule Pleroma.NotificationTest do        {:ok, [notification]} = Notification.create_notifications(status)        assert notification.user_id == subscriber.id +      assert notification.type == "status"      end      test "does not create a notification for subscribed users if status is a reply" do @@ -136,6 +137,21 @@ defmodule Pleroma.NotificationTest do        assert Enum.empty?(subscriber_notifications)      end +    test "does not create subscriber notification if mentioned" do +      user = insert(:user) +      subscriber = insert(:user) + +      User.subscribe(subscriber, user) + +      {:ok, status} = CommonAPI.post(user, %{status: "mentioning @#{subscriber.nickname}"}) +      {:ok, [notification] = notifications} = Notification.create_notifications(status) + +      assert length(notifications) == 1 + +      assert notification.user_id == subscriber.id +      assert notification.type == "mention" +    end +      test "it sends edited notifications to those who repeated a status" do        user = insert(:user)        repeated_user = insert(:user) diff --git a/test/pleroma/web/mastodon_api/views/notification_view_test.exs b/test/pleroma/web/mastodon_api/views/notification_view_test.exs index 47425d2a9..9896f81b6 100644 --- a/test/pleroma/web/mastodon_api/views/notification_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/notification_view_test.exs @@ -331,4 +331,31 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do      test_notifications_rendering([notification], user, [expected])    end + +  test "Subscribed status notification" do +    user = insert(:user) +    subscriber = insert(:user) + +    User.subscribe(subscriber, user) + +    {:ok, activity} = CommonAPI.post(user, %{status: "hi"}) +    {:ok, [notification]} = Notification.create_notifications(activity) + +    user = User.get_cached_by_id(user.id) + +    expected = %{ +      id: to_string(notification.id), +      pleroma: %{is_seen: false, is_muted: false}, +      type: "status", +      account: +        AccountView.render("show.json", %{ +          user: user, +          for: subscriber +        }), +      status: StatusView.render("show.json", %{activity: activity, for: subscriber}), +      created_at: Utils.to_masto_date(notification.inserted_at) +    } + +    test_notifications_rendering([notification], subscriber, [expected]) +  end  end | 
