commit: 2012e83e202b78d14f5d3135b98a503c2797dbda parent 8f9a139ba17fa99ca472d15023485290db0e8faf Author: nicole mikołajczyk <git@mkljczk.pl> Date: Fri, 10 Oct 2025 04:44:37 +0200 Allow filtering users with `accepts_chat_messages` capability Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>Diffstat:
6 files changed, 36 insertions(+), 2 deletions(-)diff --git a/changelog.d/filter-user-capabilities.add b/changelog.d/filter-user-capabilities.add@@ -0,0 +1 @@ +Allow filtering users with `accepts_chat_messages` capability +\ No newline at end of filediff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex@@ -16,6 +16,7 @@ defmodule Pleroma.User.Search do following = Keyword.get(opts, :following, false) result_limit = Keyword.get(opts, :limit, @limit) offset = Keyword.get(opts, :offset, 0) + capabilities = Keyword.get(opts, :capabilities, []) for_user = Keyword.get(opts, :for_user) @@ -32,7 +33,7 @@ defmodule Pleroma.User.Search do results = query_string - |> search_query(for_user, following, top_user_ids) + |> search_query(for_user, following, top_user_ids, capabilities) |> Pagination.fetch_paginated(%{"offset" => offset, "limit" => result_limit}, :offset) results @@ -80,7 +81,7 @@ defmodule Pleroma.User.Search do end end - defp search_query(query_string, for_user, following, top_user_ids) do + defp search_query(query_string, for_user, following, top_user_ids, capabilities) do for_user |> base_query(following) |> filter_blocked_user(for_user) @@ -94,6 +95,7 @@ defmodule Pleroma.User.Search do |> subquery() |> order_by(desc: :search_rank) |> maybe_restrict_local(for_user) + |> maybe_restrict_accepting_chat_messages(capabilities) |> filter_deactivated_users() end @@ -214,6 +216,14 @@ defmodule Pleroma.User.Search do end end + defp maybe_restrict_accepting_chat_messages(query, capabilities) do + if "accepts_chat_messages" in capabilities do + from(q in query, where: q.accepts_chat_messages == true) + else + query + end + end + defp limit, do: Pleroma.Config.get([:instance, :limit_to_local_content], :unauthenticated) defp restrict_local(q), do: where(q, [u], u.local == true)diff --git a/lib/pleroma/web/api_spec/operations/search_operation.ex b/lib/pleroma/web/api_spec/operations/search_operation.ex@@ -46,6 +46,12 @@ defmodule Pleroma.Web.ApiSpec.SearchOperation do :query, %Schema{allOf: [BooleanLike], default: false}, "Only include accounts that the user is following" + ), + Operation.parameter( + :capabilities, + :query, + %Schema{type: :array, items: %Schema{type: :string, enum: ["accepts_chat_messages"]}}, + "Only include accounts with given capabilities" ) ], responses: %{diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex@@ -91,6 +91,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do limit: min(params[:limit], @search_limit), offset: params[:offset], type: params[:type], + capabilities: params[:capabilities], author: get_author(params), embed_relationships: ControllerHelper.embed_relationships?(params), for_user: userdiff --git a/priv/repo/migrations/20230703215000_add_accepts_chat_messages_index_to_users.exs b/priv/repo/migrations/20230703215000_add_accepts_chat_messages_index_to_users.exs@@ -0,0 +1,7 @@ +defmodule Pleroma.Repo.Migrations.AddAcceptsChatMessagesIndexToUsers do + use Ecto.Migration + + def change do + create(index(:users, [:accepts_chat_messages])) + end +enddiff --git a/test/pleroma/user_search_test.exs b/test/pleroma/user_search_test.exs@@ -366,5 +366,13 @@ defmodule Pleroma.UserSearchTest do assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil) end + + test "find users accepting chat messages only" do + user1 = insert(:user, nickname: "user1", accepts_chat_messages: true) + insert(:user, nickname: "user2", accepts_chat_messages: false) + + [found_user1] = User.search("user", capabilities: ["accepts_chat_messages"]) + assert found_user1.id == user1.id + end end end