diff --git a/app/controllers/avo/search_controller.rb b/app/controllers/avo/search_controller.rb index 9ab23b2801..9e1174d3bb 100644 --- a/app/controllers/avo/search_controller.rb +++ b/app/controllers/avo/search_controller.rb @@ -53,7 +53,7 @@ def search_resource(resource) results_count = query.reselect(resource.model_class.primary_key).count # Get the results - query = query.limit(Avo.configuration.search_results_count) + query = query.limit(search_results_count(resource)) results = apply_search_metadata(query, resource) @@ -201,5 +201,16 @@ def render_search_error(error) } }, status: 500 end + + def search_results_count(resource) + if resource.search_results_count + Avo::ExecutionContext.new( + target: resource.search_results_count, + params: params + ).handle + else + Avo.configuration.search_results_count + end + end end end diff --git a/lib/avo/base_resource.rb b/lib/avo/base_resource.rb index 87df2cafc8..6d9caeb299 100644 --- a/lib/avo/base_resource.rb +++ b/lib/avo/base_resource.rb @@ -216,6 +216,10 @@ def search_query search.dig(:query) end + def search_results_count + search.dig(:results_count) + end + def fetch_search(key, record: nil) # self.class.fetch_search Avo::ExecutionContext.new(target: search[key], resource: self, record: record).handle diff --git a/spec/features/avo/search_results_count_spec.rb b/spec/features/avo/search_results_count_spec.rb new file mode 100644 index 0000000000..d2ac9c3657 --- /dev/null +++ b/spec/features/avo/search_results_count_spec.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.feature Avo::SearchController, type: :controller do + let!(:courses) do + create_list(:course, 10) do |course, idx| + course.name = "course_#{idx + 1}" + course.save! + end + end + + context "When results_count is not set in the resource" do + it "Returns 8 results by default" do + get :show, params: { + resource_name: "course", + global: false, + q: "course" + } + + expect(json["courses"]["count"]).to eq 8 + end + end + + context "When results_count is changed in a per resource basis" do + after(:example) do + Avo::Resources::Course.search[:results_count] = nil + end + + it "Return 5 when configured" do + Avo::Resources::Course.search[:results_count] = 5 + get :show, params: { + resource_name: "course", + global: false, + q: "course" + } + + expect(json["courses"]["count"]).to eq 5 + end + + it "Return 2 when configured" do + Avo::Resources::Course.search[:results_count] = 2 + get :show, params: { + resource_name: "course", + global: false, + q: "course" + } + + expect(json["courses"]["count"]).to eq 2 + end + + let!(:post) { create :post, name: "Avi's masterclass" } + + it "is configurable per resource" do + Avo::Resources::Post.search[:results_count] = 0 + get :show, params: { + resource_name: "post", + global: false, + q: "class" + } + + expect(json["posts"]["count"]).to eq 0 + + res = get :show, params: { + resource_name: "course", + global: false, + q: "course" + } + expect(JSON.parse(res.body)["courses"]["count"]).to eq 8 + end + end +end