revert 4a94c9a31ef11f63ea71ad9c1f085c18cf8ef083
[akkoma] / lib / pleroma / web / mastodon_api / controllers / suggestion_controller.ex
index 4ebfc737c74a0d4892e985e2d9cb6f56bd99582b..e913fcf4bbb5c66f8e850ca81fb832e57e3f9bd6 100644 (file)
@@ -4,6 +4,8 @@
 
 defmodule Pleroma.Web.MastodonAPI.SuggestionController do
   use Pleroma.Web, :controller
+  import Ecto.Query
+  alias Pleroma.FollowingRelationship
   alias Pleroma.User
   alias Pleroma.UserRelationship
 
@@ -69,11 +71,43 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionController 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()
+      |> exclude_user(user)
+      |> exclude_relationships(user, [:block, :mute, :suggestion_dismiss])
+      |> exclude_following(user)
       |> 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
+
+  defp exclude_user(query, %User{id: user_id}) do
+    where(query, [u], u.id != ^user_id)
+  end
+
+  defp exclude_relationships(query, %User{id: user_id}, relationship_types) do
+    query
+    |> join(:left, [u], r in UserRelationship,
+      as: :user_relationships,
+      on:
+        r.target_id == u.id and r.source_id == ^user_id and
+          r.relationship_type in ^relationship_types
+    )
+    |> where([user_relationships: r], is_nil(r.target_id))
+  end
+
+  defp exclude_following(query, %User{id: user_id}) do
+    query
+    |> join(:left, [u], r in FollowingRelationship,
+      as: :following_relationships,
+      on: r.following_id == u.id and r.follower_id == ^user_id and r.state == :follow_accept
+    )
+    |> where([following_relationships: r], is_nil(r.following_id))
   end
 
   @doc "DELETE /api/v1/suggestions/:account_id"