diff options
| author | eugenijm <eugenijm@protonmail.com> | 2020-05-18 18:46:04 +0300 | 
|---|---|---|
| committer | eugenijm <eugenijm@protonmail.com> | 2020-06-14 18:27:11 +0300 | 
| commit | b15cfc3d365dcfa5f99159fe06e29de6f8aceb4f (patch) | |
| tree | 156ff3c3c0fb6eb12064e536ae5a754048b48af4 /lib | |
| parent | 271ea5068f4e3b901cb3f682e132378246daf452 (diff) | |
| download | pleroma-b15cfc3d365dcfa5f99159fe06e29de6f8aceb4f.tar.gz pleroma-b15cfc3d365dcfa5f99159fe06e29de6f8aceb4f.zip | |
Mastodon API: ensure the notification endpoint doesn't return less than the requested amount of records unless it's the last page
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/notification.ex | 19 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 8 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/notification_view.ex | 68 | 
3 files changed, 57 insertions, 38 deletions
| diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 3386a1933..9ee9606be 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -166,8 +166,16 @@ defmodule Pleroma.Notification do        query        |> join(:left, [n, a], mutated_activity in Pleroma.Activity,          on: -          fragment("?->>'context'", a.data) == -            fragment("?->>'context'", mutated_activity.data) and +          fragment( +            "COALESCE((?->'object')->>'id', ?->>'object')", +            a.data, +            a.data +          ) == +            fragment( +              "COALESCE((?->'object')->>'id', ?->>'object')", +              mutated_activity.data, +              mutated_activity.data +            ) and              fragment("(?->>'type' = 'Like' or ?->>'type' = 'Announce')", a.data, a.data) and              fragment("?->>'type'", mutated_activity.data) == "Create",          as: :mutated_activity @@ -541,6 +549,7 @@ defmodule Pleroma.Notification do    def skip?(%Activity{} = activity, %User{} = user) do      [        :self, +      :invisible,        :followers,        :follows,        :non_followers, @@ -557,6 +566,12 @@ defmodule Pleroma.Notification do      activity.data["actor"] == user.ap_id    end +  def skip?(:invisible, %Activity{} = activity, _) do +    actor = activity.data["actor"] +    user = User.get_cached_by_ap_id(actor) +    User.invisible?(user) +  end +    def skip?(          :followers,          %Activity{} = activity, diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index c5c74d132..52ac9052b 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1488,6 +1488,7 @@ defmodule Pleroma.User do      end)      delete_user_activities(user) +    delete_notifications_from_user_activities(user)      delete_outgoing_pending_follow_requests(user) @@ -1576,6 +1577,13 @@ defmodule Pleroma.User do      })    end +  def delete_notifications_from_user_activities(%User{ap_id: ap_id}) do +    Notification +    |> join(:inner, [n], activity in assoc(n, :activity)) +    |> where([n, a], fragment("? = ?", a.actor, ^ap_id)) +    |> Repo.delete_all() +  end +    def delete_user_activities(%User{ap_id: ap_id} = user) do      ap_id      |> Activity.Queries.by_actor() diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index b11578623..3865be280 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -46,6 +46,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do              activities              |> Enum.filter(&(&1.data["type"] == "Move"))              |> Enum.map(&User.get_cached_by_ap_id(&1.data["target"])) +            |> Enum.filter(& &1)            actors =              activities @@ -84,50 +85,45 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do      # Note: :relationships contain user mutes (needed for :muted flag in :status)      status_render_opts = %{relationships: opts[:relationships]} -    with %{id: _} = account <- -           AccountView.render( -             "show.json", -             %{user: actor, for: reading_user} -           ) do -      response = %{ -        id: to_string(notification.id), -        type: notification.type, -        created_at: CommonAPI.Utils.to_masto_date(notification.inserted_at), -        account: account, -        pleroma: %{ -          is_seen: notification.seen -        } +    account = +      AccountView.render( +        "show.json", +        %{user: actor, for: reading_user} +      ) + +    response = %{ +      id: to_string(notification.id), +      type: notification.type, +      created_at: CommonAPI.Utils.to_masto_date(notification.inserted_at), +      account: account, +      pleroma: %{ +        is_seen: notification.seen        } +    } -      case notification.type do -        "mention" -> -          put_status(response, activity, reading_user, status_render_opts) +    case notification.type do +      "mention" -> +        put_status(response, activity, reading_user, status_render_opts) -        "favourite" -> -          put_status(response, parent_activity_fn.(), reading_user, status_render_opts) +      "favourite" -> +        put_status(response, parent_activity_fn.(), reading_user, status_render_opts) -        "reblog" -> -          put_status(response, parent_activity_fn.(), reading_user, status_render_opts) +      "reblog" -> +        put_status(response, parent_activity_fn.(), reading_user, status_render_opts) -        "move" -> -          put_target(response, activity, reading_user, %{}) +      "move" -> +        put_target(response, activity, reading_user, %{}) -        "pleroma:emoji_reaction" -> -          response -          |> put_status(parent_activity_fn.(), reading_user, status_render_opts) -          |> put_emoji(activity) +      "pleroma:emoji_reaction" -> +        response +        |> put_status(parent_activity_fn.(), reading_user, status_render_opts) +        |> put_emoji(activity) -        "pleroma:chat_mention" -> -          put_chat_message(response, activity, reading_user, status_render_opts) +      "pleroma:chat_mention" -> +        put_chat_message(response, activity, reading_user, status_render_opts) -        type when type in ["follow", "follow_request"] -> -          response - -        _ -> -          nil -      end -    else -      _ -> nil +      type when type in ["follow", "follow_request"] -> +        response      end    end | 
