FIX: Allow user directory searches to return more than 20 matching results (#31032)

This PR modifies the directory search logic so that searches by user
fields or name are no longer capped at 20 users
This commit is contained in:
Jean
2025-01-29 11:02:42 -04:00
committed by GitHub
parent a16b2f2248
commit ba1464a84e
2 changed files with 39 additions and 4 deletions

View File

@ -62,7 +62,8 @@ class DirectoryItemsController < ApplicationController
user_ids = nil
if params[:name].present?
user_ids = UserSearch.new(params[:name], include_staged_users: true).search.pluck(:id)
user_ids =
UserSearch.new(params[:name], { include_staged_users: true, limit: 200 }).search.pluck(:id)
if user_ids.present?
# Add the current user if we have at least one other match
user_ids << current_user.id if current_user && result.dup.where(user_id: user_ids).exists?
@ -86,7 +87,7 @@ class DirectoryItemsController < ApplicationController
result_count = result.count
result = result.limit(limit).offset(limit * page).to_a
more_params = params.slice(:period, :order, :asc, :group, :user_field_ids).permit!
more_params = params.slice(:period, :order, :asc, :group, :user_field_ids, :name).permit!
more_params[:page] = page + 1
load_more_uri = URI.parse(directory_items_path(more_params))
load_more_directory_items_json = "#{load_more_uri.path}.json?#{load_more_uri.query}"

View File

@ -326,8 +326,8 @@ RSpec.describe DirectoryItemsController do
expect(json).to be_present
items = json["directory_items"]
# Internal reference: /t/139545
expect(items.length).to eq(20)
expect(json["meta"]["total_rows_directory_items"]).to eq(20)
expect(items.length).to eq(30)
expect(json["meta"]["total_rows_directory_items"]).to eq(30)
end
it "checks group permissions" do
@ -354,4 +354,38 @@ RSpec.describe DirectoryItemsController do
expect(response.parsed_body["directory_items"].length).to eq(2)
end
end
context "when searching by name" do
it "searches users by custom field 'Music' ignoring the default 20 user limit" do
field = Fabricate(:user_field, searchable: true)
users = Fabricate.times(100, :user)
users
.first(70)
.each do |u|
UserCustomField.create!(user_id: u.id, name: "user_field_#{field.id}", value: "Music")
end
DirectoryItem.refresh!
SearchIndexer.with_indexing { users.each { |u| SearchIndexer.index(u, force: true) } }
get "/directory_items.json",
params: {
period: "all",
name: "Music",
user_field_ids: field.id.to_s,
}
json = response.parsed_body
items = json["directory_items"]
expect(items.size).to eq(50) # The directory’s PAGE_SIZE is set to 50, so we only see 50 per page
expect(json["meta"]["total_rows_directory_items"]).to eq(70) # only 70 users have the Music field set
items.each do |item|
fields = item["user"]["user_fields"]
expect(fields[field.id.to_s]["value"]).to include("Music")
end
end
end
end