mirror of
https://github.com/discourse/discourse.git
synced 2025-06-04 21:34:40 +08:00
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:
@ -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}"
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user