v2 Suggestions: actually flter out dismissed suggestions
authorAlex Gleason <alex@alexgleason.me>
Sat, 27 Nov 2021 03:02:14 +0000 (21:02 -0600)
committerAlex Gleason <alex@alexgleason.me>
Sat, 27 Nov 2021 03:09:37 +0000 (21:09 -0600)
lib/pleroma/user/query.ex
lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex
test/pleroma/web/mastodon_api/controllers/suggestion_controller_test.exs

index 334e395fb10e3623f18a94f390a7174ea0a25d56..6d4a4ead6c480797ebcc2bed1efdf94389ed99fc 100644 (file)
@@ -46,6 +46,7 @@ defmodule Pleroma.User.Query do
             unconfirmed: boolean(),
             is_admin: boolean(),
             is_moderator: boolean(),
+            is_suggested: boolean(),
             super_users: boolean(),
             invisible: boolean(),
             internal: boolean(),
index 4ebfc737c74a0d4892e985e2d9cb6f56bd99582b..3c5a07b7d4ce8e04c78145d5d8a354b5661c6b7e 100644 (file)
@@ -4,6 +4,7 @@
 
 defmodule Pleroma.Web.MastodonAPI.SuggestionController do
   use Pleroma.Web, :controller
+  import Ecto.Query
   alias Pleroma.User
   alias Pleroma.UserRelationship
 
@@ -65,15 +66,28 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionController do
     do: Pleroma.Web.MastodonAPI.MastodonAPIController.empty_array(conn, params)
 
   @doc "GET /api/v2/suggestions"
-  def index2(%{assigns: %{user: user}} = conn, params) do
+  def index2(%{assigns: %{user: %{id: user_id} = user}} = conn, params) do
     limit = Map.get(params, :limit, 40) |> min(80)
 
     users =
-      %{is_suggested: true, limit: limit}
+      %{is_suggested: true, invisible: false, limit: limit}
       |> User.Query.build()
+      |> where([u], u.id != ^user_id)
+      |> join(:left, [u], r in UserRelationship,
+        as: :relationships,
+        on:
+          r.target_id == u.id and r.source_id == ^user_id and
+            r.relationship_type in [:block, :mute, :suggestion_dismiss]
+      )
+      |> where([relationships: r], is_nil(r.target_id))
       |> Pleroma.Repo.all()
 
-    render(conn, "index.json", %{users: users, source: :staff, for: user})
+    render(conn, "index.json", %{
+      users: users,
+      source: :staff,
+      for: user,
+      skip_visibility_check: true
+    })
   end
 
   @doc "DELETE /api/v1/suggestions/:account_id"
index 803a38c676eecd49c032cd4dffd8037223b83a3d..8948a52de149c60d1ecb10ed5eb2c9133911ff55 100644 (file)
@@ -29,6 +29,33 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do
     assert [%{"source" => "staff", "account" => %{"id" => ^user_id}}] = res
   end
 
+  test "returns v2 suggestions excluding dismissed accounts", %{conn: conn} do
+    %{id: user_id} = insert(:user, is_suggested: true)
+
+    conn
+    |> delete("/api/v1/suggestions/#{user_id}")
+    |> json_response_and_validate_schema(200)
+
+    res =
+      conn
+      |> get("/api/v2/suggestions")
+      |> json_response_and_validate_schema(200)
+
+    assert [] = res
+  end
+
+  test "returns v2 suggestions excluding blocked accounts", %{conn: conn, user: blocker} do
+    blocked = insert(:user, is_suggested: true)
+    {:ok, _} = Pleroma.Web.CommonAPI.block(blocker, blocked)
+
+    res =
+      conn
+      |> get("/api/v2/suggestions")
+      |> json_response_and_validate_schema(200)
+
+    assert [] = res
+  end
+
   test "dismiss suggestion", %{conn: conn, user: source} do
     target = insert(:user, is_suggested: true)