Restricted embedding of relationships where applicable (statuses / notifications...
authorIvan Tashkinov <ivantashkinov@gmail.com>
Fri, 1 May 2020 15:45:24 +0000 (18:45 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Fri, 1 May 2020 15:45:24 +0000 (18:45 +0300)
Added support for :skip_notifications for accounts listing (index.json).
Adjusted tests.

18 files changed:
benchmarks/load_testing/fetcher.ex
config/config.exs
lib/mix/tasks/pleroma/benchmark.ex
lib/pleroma/web/admin_api/admin_api_controller.ex
lib/pleroma/web/admin_api/views/report_view.ex
lib/pleroma/web/admin_api/views/status_view.ex
lib/pleroma/web/chat_channel.ex
lib/pleroma/web/controller_helper.ex
lib/pleroma/web/mastodon_api/controllers/search_controller.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
lib/pleroma/web/mastodon_api/views/notification_view.ex
lib/pleroma/web/mastodon_api/views/status_view.ex
lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex
test/web/mastodon_api/controllers/notification_controller_test.exs
test/web/mastodon_api/controllers/status_controller_test.exs
test/web/mastodon_api/controllers/timeline_controller_test.exs
test/web/mastodon_api/views/notification_view_test.exs
test/web/mastodon_api/views/status_view_test.exs

index 12c30f6f55a1b71f88070a83b7106b7667b4da43..0de4924bcac30d141f001e728b4debc12b1fc737 100644 (file)
@@ -387,56 +387,47 @@ defmodule Pleroma.LoadTesting.Fetcher do
 
     favourites = ActivityPub.fetch_favourites(user)
 
-    output_relationships =
-      !!Pleroma.Config.get([:extensions, :output_relationships_in_statuses_by_default])
-
     Benchee.run(
       %{
         "Rendering home timeline" => fn ->
           StatusView.render("index.json", %{
             activities: home_activities,
             for: user,
-            as: :activity,
-            skip_relationships: !output_relationships
+            as: :activity
           })
         end,
         "Rendering direct timeline" => fn ->
           StatusView.render("index.json", %{
             activities: direct_activities,
             for: user,
-            as: :activity,
-            skip_relationships: !output_relationships
+            as: :activity
           })
         end,
         "Rendering public timeline" => fn ->
           StatusView.render("index.json", %{
             activities: public_activities,
             for: user,
-            as: :activity,
-            skip_relationships: !output_relationships
+            as: :activity
           })
         end,
         "Rendering tag timeline" => fn ->
           StatusView.render("index.json", %{
             activities: tag_activities,
             for: user,
-            as: :activity,
-            skip_relationships: !output_relationships
+            as: :activity
           })
         end,
         "Rendering notifications" => fn ->
           Pleroma.Web.MastodonAPI.NotificationView.render("index.json", %{
             notifications: notifications,
-            for: user,
-            skip_relationships: !output_relationships
+            for: user
           })
         end,
         "Rendering favourites timeline" => fn ->
           StatusView.render("index.json", %{
             activities: favourites,
             for: user,
-            as: :activity,
-            skip_relationships: !output_relationships
+            as: :activity
           })
         end
       },
index 2e538c4be7dfa9ad622b15735e7a70db788fd5b3..d698e6028ce043fdddd98faa4b6c3ee0f4e3be55 100644 (file)
@@ -240,8 +240,6 @@ config :pleroma, :instance,
   extended_nickname_format: true,
   cleanup_attachments: false
 
-config :pleroma, :extensions, output_relationships_in_statuses_by_default: true
-
 config :pleroma, :feed,
   post_title: %{
     max_length: 100,
index 6ab7fe8ef6aaac665ab330b4c3b3fbaa75671140..dd2b9c8f278b26d28506b14a413d341a704c6417 100644 (file)
@@ -67,8 +67,7 @@ defmodule Mix.Tasks.Pleroma.Benchmark do
           Pleroma.Web.MastodonAPI.StatusView.render("index.json", %{
             activities: activities,
             for: user,
-            as: :activity,
-            skip_relationships: true
+            as: :activity
           })
         end
       },
index 816c11e01f593ff8809811bb0fc461ff56776d9a..e0e1a2ceb27ae3674774e3138239f2c965f8f169 100644 (file)
@@ -280,7 +280,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
 
     conn
     |> put_view(Pleroma.Web.AdminAPI.StatusView)
-    |> render("index.json", %{activities: activities, as: :activity, skip_relationships: false})
+    |> render("index.json", %{activities: activities, as: :activity})
   end
 
   def list_user_statuses(conn, %{"nickname" => nickname} = params) do
@@ -299,7 +299,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
 
       conn
       |> put_view(StatusView)
-      |> render("index.json", %{activities: activities, as: :activity, skip_relationships: false})
+      |> render("index.json", %{activities: activities, as: :activity})
     else
       _ -> {:error, :not_found}
     end
@@ -834,7 +834,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
 
     conn
     |> put_view(Pleroma.Web.AdminAPI.StatusView)
-    |> render("index.json", %{activities: activities, as: :activity, skip_relationships: false})
+    |> render("index.json", %{activities: activities, as: :activity})
   end
 
   def status_update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do
index d50969b2a7a4712e63c619d42dcbb57950cd6006..215e311008fc8c081e461cd8737066341cee8b1c 100644 (file)
@@ -7,8 +7,10 @@ defmodule Pleroma.Web.AdminAPI.ReportView do
 
   alias Pleroma.HTML
   alias Pleroma.User
+  alias Pleroma.Web.AdminAPI
   alias Pleroma.Web.AdminAPI.Report
   alias Pleroma.Web.CommonAPI.Utils
+  alias Pleroma.Web.MastodonAPI
   alias Pleroma.Web.MastodonAPI.StatusView
 
   def render("index.json", %{reports: reports}) do
@@ -41,8 +43,7 @@ defmodule Pleroma.Web.AdminAPI.ReportView do
       statuses:
         StatusView.render("index.json", %{
           activities: statuses,
-          as: :activity,
-          skip_relationships: false
+          as: :activity
         }),
       state: report.data["state"],
       notes: render(__MODULE__, "index_notes.json", %{notes: report.report_notes})
@@ -72,8 +73,8 @@ defmodule Pleroma.Web.AdminAPI.ReportView do
   end
 
   defp merge_account_views(%User{} = user) do
-    Pleroma.Web.MastodonAPI.AccountView.render("show.json", %{user: user})
-    |> Map.merge(Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user}))
+    MastodonAPI.AccountView.render("show.json", %{user: user, skip_relationships: true})
+    |> Map.merge(AdminAPI.AccountView.render("show.json", %{user: user}))
   end
 
   defp merge_account_views(_), do: %{}
index 3637dee24eb42fef069b9307bd5ad04a40bf3b87..a76fad990ad96032ae4a590327c64a8898ea0924 100644 (file)
@@ -8,6 +8,8 @@ defmodule Pleroma.Web.AdminAPI.StatusView do
   require Pleroma.Constants
 
   alias Pleroma.User
+  alias Pleroma.Web.AdminAPI
+  alias Pleroma.Web.MastodonAPI
   alias Pleroma.Web.MastodonAPI.StatusView
 
   def render("index.json", opts) do
@@ -22,8 +24,8 @@ defmodule Pleroma.Web.AdminAPI.StatusView do
   end
 
   defp merge_account_views(%User{} = user) do
-    Pleroma.Web.MastodonAPI.AccountView.render("show.json", %{user: user})
-    |> Map.merge(Pleroma.Web.AdminAPI.AccountView.render("show.json", %{user: user}))
+    MastodonAPI.AccountView.render("show.json", %{user: user, skip_relationships: true})
+    |> Map.merge(AdminAPI.AccountView.render("show.json", %{user: user}))
   end
 
   defp merge_account_views(_), do: %{}
index 38ec774f70330b46d2f73f72e17bc99b84dd66ca..3df8dc0f1e607c0be841c1f9eaab2af93e8f4daf 100644 (file)
@@ -22,7 +22,13 @@ defmodule Pleroma.Web.ChatChannel do
 
     if String.length(text) in 1..Pleroma.Config.get([:instance, :chat_limit]) do
       author = User.get_cached_by_nickname(user_name)
-      author = Pleroma.Web.MastodonAPI.AccountView.render("show.json", user: author)
+
+      author =
+        Pleroma.Web.MastodonAPI.AccountView.render("show.json",
+          user: author,
+          skip_relationships: true
+        )
+
       message = ChatChannelState.add_message(%{text: text, author: author})
 
       broadcast!(socket, "new_msg", message)
index eb97ae975e32b3c0ff0886e3c75e526cbbdf32cd..f0b4c087a1905e50e4b91d5baec26cf95342b49e 100644 (file)
@@ -5,8 +5,6 @@
 defmodule Pleroma.Web.ControllerHelper do
   use Pleroma.Web, :controller
 
-  alias Pleroma.Config
-
   # As in Mastodon API, per https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html
   @falsy_param_values [false, 0, "0", "f", "F", "false", "False", "FALSE", "off", "OFF"]
 
@@ -106,13 +104,8 @@ defmodule Pleroma.Web.ControllerHelper do
 
   def put_if_exist(map, key, value), do: Map.put(map, key, value)
 
-  @doc "Whether to skip rendering `[:account][:pleroma][:relationship]`for statuses/notifications"
+  @doc "Whether to skip `account.pleroma.relationship` rendering for statuses/notifications"
   def skip_relationships?(params) do
-    if Config.get([:extensions, :output_relationships_in_statuses_by_default]) do
-      false
-    else
-      # BREAKING: older PleromaFE versions do not send this param but _do_ expect relationships.
-      not truthy_param?(params["with_relationships"])
-    end
+    not truthy_param?(params["with_relationships"])
   end
 end
index cd49da6ad5e236ddfb9ce072e55328e2f6423d83..85a316762160a95e2cc79b511eda20c235eb04a4 100644 (file)
@@ -86,7 +86,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do
       users: accounts,
       for: options[:for_user],
       as: :user,
-      skip_relationships: false
+      skip_relationships: true
     )
   end
 
index b4b61e74cfd393fe22cb9241a024c4cce661178f..6d17c2d02e564cde6adb8d7df592ee77acee4ad3 100644 (file)
@@ -13,15 +13,16 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
   alias Pleroma.Web.MediaProxy
 
   def render("index.json", %{users: users} = opts) do
+    opts = Map.merge(%{skip_relationships: false}, opts)
+
     reading_user = opts[:for]
 
-    # Note: :skip_relationships option is currently intentionally not supported for accounts
     relationships_opt =
       cond do
         Map.has_key?(opts, :relationships) ->
           opts[:relationships]
 
-        is_nil(reading_user) ->
+        is_nil(reading_user) || opts[:skip_relationships] ->
           UserRelationship.view_relationships_option(nil, [])
 
         true ->
@@ -158,6 +159,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
   end
 
   defp do_render("show.json", %{user: user} = opts) do
+    opts = Map.merge(%{skip_relationships: false}, opts)
+
     user = User.sanitize_html(user, User.html_filter_policy(opts[:for]))
     display_name = user.name || user.nickname
 
index 4da1ab67f58385e2548c1e923fb742f09afc5f7b..e518bdedb09f6f2f26dfdd4557356e83a79eb456 100644 (file)
@@ -15,6 +15,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do
   alias Pleroma.Web.MastodonAPI.StatusView
 
   def render("index.json", %{notifications: notifications, for: reading_user} = opts) do
+    opts = Map.merge(%{skip_relationships: true}, opts)
+
     activities = Enum.map(notifications, & &1.activity)
 
     parent_activities =
@@ -71,6 +73,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do
           for: reading_user
         } = opts
       ) do
+    opts = Map.merge(%{skip_relationships: true}, opts)
+
     actor = User.get_cached_by_ap_id(activity.data["actor"])
 
     parent_activity_fn = fn ->
index 24167f66f76f4f8a614b8dbc6439ee2456692b4e..0bcc84d4444e3f055a171946985a3e68bdf480df 100644 (file)
@@ -76,6 +76,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
   end
 
   def render("index.json", opts) do
+    opts = Map.merge(%{skip_relationships: true}, opts)
+
     reading_user = opts[:for]
 
     # To do: check AdminAPIControllerTest on the reasons behind nil activities in the list
@@ -125,6 +127,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
         "show.json",
         %{activity: %{data: %{"type" => "Announce", "object" => _object}} = activity} = opts
       ) do
+    opts = Map.merge(%{skip_relationships: true}, opts)
+
     user = get_user(activity.data["actor"])
     created_at = Utils.to_masto_date(activity.data["published"])
     activity_object = Object.normalize(activity)
@@ -198,6 +202,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
   end
 
   def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do
+    opts = Map.merge(%{skip_relationships: true}, opts)
+
     object = Object.normalize(activity)
 
     user = get_user(activity.data["actor"])
index 2c1874051ed833aac8336be4a58351ae30b5f41b..f3ac17a66b8774c408134db7e0bf8f5cf1462493 100644 (file)
@@ -66,7 +66,13 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do
             %{
               name: emoji,
               count: length(users),
-              accounts: AccountView.render("index.json", %{users: users, for: user, as: :user}),
+              accounts:
+                AccountView.render("index.json", %{
+                  users: users,
+                  for: user,
+                  as: :user,
+                  skip_relationships: true
+                }),
               me: !!(user && user.ap_id in user_ap_ids)
             }
           end
index db380f76a5580cb888e0829e68dd7f2711871be8..e2d98ef3e58b57c16e05bdf7113816f44fd673e1 100644 (file)
@@ -12,9 +12,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do
 
   import Pleroma.Factory
 
-  test "does NOT render account/pleroma/relationship if this is disabled by default" do
-    clear_config([:extensions, :output_relationships_in_statuses_by_default], false)
-
+  test "does NOT render account/pleroma/relationship by default" do
     %{user: user, conn: conn} = oauth_access(["read:notifications"])
     other_user = insert(:user)
 
index 85068edd00eddf9a0551073ed6273d1962604f6d..00e026087641d9b8b40276d06136d1e60fd1b6f2 100644 (file)
@@ -1058,7 +1058,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
   end
 
   test "bookmarks" do
-    bookmarks_uri = "/api/v1/bookmarks?with_relationships=true"
+    bookmarks_uri = "/api/v1/bookmarks"
 
     %{conn: conn} = oauth_access(["write:bookmarks", "read:bookmarks"])
     author = insert(:user)
index 06efdc901aa763ae6dd58a7628b544f5a06c0a43..b8bb83af7fb3e19c1cee5c01b30b10bf6ce239e8 100644 (file)
@@ -20,12 +20,10 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do
   describe "home" do
     setup do: oauth_access(["read:statuses"])
 
-    test "does NOT render account/pleroma/relationship if this is disabled by default", %{
+    test "does NOT render account/pleroma/relationship by default", %{
       user: user,
       conn: conn
     } do
-      clear_config([:extensions, :output_relationships_in_statuses_by_default], false)
-
       other_user = insert(:user)
 
       {:ok, _} = CommonAPI.post(other_user, %{"status" => "hi @#{user.nickname}"})
@@ -41,7 +39,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do
              end)
     end
 
-    test "the home timeline", %{user: user, conn: conn} do
+    test "embeds account relationships with `with_relationships=true`", %{user: user, conn: conn} do
       uri = "/api/v1/timelines/home?with_relationships=true"
 
       following = insert(:user, nickname: "followed")
@@ -69,13 +67,19 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do
                      }
                    }
                  },
-                 "account" => %{"pleroma" => %{"relationship" => %{"following" => true}}}
+                 "account" => %{
+                   "pleroma" => %{
+                     "relationship" => %{"following" => true}
+                   }
+                 }
                },
                %{
                  "content" => "post",
                  "account" => %{
                    "acct" => "followed",
-                   "pleroma" => %{"relationship" => %{"following" => true}}
+                   "pleroma" => %{
+                     "relationship" => %{"following" => true}
+                   }
                  }
                }
              ] = json_response(ret_conn, :ok)
@@ -95,13 +99,19 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do
                      }
                    }
                  },
-                 "account" => %{"pleroma" => %{"relationship" => %{"following" => true}}}
+                 "account" => %{
+                   "pleroma" => %{
+                     "relationship" => %{"following" => true}
+                   }
+                 }
                },
                %{
                  "content" => "post",
                  "account" => %{
                    "acct" => "followed",
-                   "pleroma" => %{"relationship" => %{"following" => true}}
+                   "pleroma" => %{
+                     "relationship" => %{"following" => true}
+                   }
                  }
                }
              ] = json_response(ret_conn, :ok)
index c3ec9dfecbcf3f1dc44186748c30097fc2b03c28..e1f9c3ac4dd472ac48f26869eb5267a58b459dfc 100644 (file)
@@ -42,7 +42,12 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
       id: to_string(notification.id),
       pleroma: %{is_seen: false},
       type: "mention",
-      account: AccountView.render("show.json", %{user: user, for: mentioned_user}),
+      account:
+        AccountView.render("show.json", %{
+          user: user,
+          for: mentioned_user,
+          skip_relationships: true
+        }),
       status: StatusView.render("show.json", %{activity: activity, for: mentioned_user}),
       created_at: Utils.to_masto_date(notification.inserted_at)
     }
@@ -62,7 +67,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
       id: to_string(notification.id),
       pleroma: %{is_seen: false},
       type: "favourite",
-      account: AccountView.render("show.json", %{user: another_user, for: user}),
+      account:
+        AccountView.render("show.json", %{user: another_user, for: user, skip_relationships: true}),
       status: StatusView.render("show.json", %{activity: create_activity, for: user}),
       created_at: Utils.to_masto_date(notification.inserted_at)
     }
@@ -82,7 +88,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
       id: to_string(notification.id),
       pleroma: %{is_seen: false},
       type: "reblog",
-      account: AccountView.render("show.json", %{user: another_user, for: user}),
+      account:
+        AccountView.render("show.json", %{user: another_user, for: user, skip_relationships: true}),
       status: StatusView.render("show.json", %{activity: reblog_activity, for: user}),
       created_at: Utils.to_masto_date(notification.inserted_at)
     }
@@ -100,7 +107,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
       id: to_string(notification.id),
       pleroma: %{is_seen: false},
       type: "follow",
-      account: AccountView.render("show.json", %{user: follower, for: followed}),
+      account:
+        AccountView.render("show.json", %{user: follower, for: followed, skip_relationships: true}),
       created_at: Utils.to_masto_date(notification.inserted_at)
     }
 
@@ -143,8 +151,10 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
       id: to_string(notification.id),
       pleroma: %{is_seen: false},
       type: "move",
-      account: AccountView.render("show.json", %{user: old_user, for: follower}),
-      target: AccountView.render("show.json", %{user: new_user, for: follower}),
+      account:
+        AccountView.render("show.json", %{user: old_user, for: follower, skip_relationships: true}),
+      target:
+        AccountView.render("show.json", %{user: new_user, for: follower, skip_relationships: true}),
       created_at: Utils.to_masto_date(notification.inserted_at)
     }
 
@@ -169,7 +179,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
       pleroma: %{is_seen: false},
       type: "pleroma:emoji_reaction",
       emoji: "☕",
-      account: AccountView.render("show.json", %{user: other_user, for: user}),
+      account:
+        AccountView.render("show.json", %{user: other_user, for: user, skip_relationships: true}),
       status: StatusView.render("show.json", %{activity: activity, for: user}),
       created_at: Utils.to_masto_date(notification.inserted_at)
     }
index 6791c2fb08b5fdebd1a95e37424f03da8bcd28ec..91d4ded2c94395b46b5ab84d2034711b1a302483 100644 (file)
@@ -555,7 +555,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
     end
   end
 
-  test "embeds a relationship in the account" do
+  test "does not embed a relationship in the account" do
     user = insert(:user)
     other_user = insert(:user)
 
@@ -566,11 +566,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
 
     result = StatusView.render("show.json", %{activity: activity, for: other_user})
 
-    assert result[:account][:pleroma][:relationship] ==
-             AccountView.render("relationship.json", %{user: other_user, target: user})
+    assert result[:account][:pleroma][:relationship] == %{}
   end
 
-  test "embeds a relationship in the account in reposts" do
+  test "does not embed a relationship in the account in reposts" do
     user = insert(:user)
     other_user = insert(:user)
 
@@ -583,11 +582,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
 
     result = StatusView.render("show.json", %{activity: activity, for: user})
 
-    assert result[:account][:pleroma][:relationship] ==
-             AccountView.render("relationship.json", %{user: user, target: other_user})
-
-    assert result[:reblog][:account][:pleroma][:relationship] ==
-             AccountView.render("relationship.json", %{user: user, target: user})
+    assert result[:account][:pleroma][:relationship] == %{}
+    assert result[:reblog][:account][:pleroma][:relationship] == %{}
   end
 
   test "visibility/list" do