FEATURE: Add `in:polls` filter to search (#19885)

Allows users to filter search results to posts with polls (if the plugin is enabled).
This commit is contained in:
Penar Musaraj 2023-01-18 14:55:20 -05:00 committed by GitHub
parent 60ebbfd7e7
commit 3e197deec9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 0 deletions

View File

@ -134,6 +134,11 @@ function initializePolls(api) {
id: "discourse-poll",
});
api.cleanupStream(cleanUpPolls);
const siteSettings = api.container.lookup("site-settings:main");
if (siteSettings.poll_enabled) {
api.addSearchSuggestion("in:polls");
}
}
export default {

View File

@ -231,4 +231,12 @@ after_initialize do
SiteSetting.poll_enabled && scope.user&.id.present? && preloaded_polls.present? &&
preloaded_polls.any? { |p| p.has_voted?(scope.user) }
end
register_search_advanced_filter(/in:polls/) do |posts, match|
if SiteSetting.poll_enabled
posts.joins(:polls)
else
posts
end
end
end

View File

@ -0,0 +1,42 @@
# frozen_string_literal: true
RSpec.describe Search do
fab!(:topic) { Fabricate(:topic) }
fab!(:topic2) { Fabricate(:topic) }
fab!(:regular_post) { Fabricate(:post, topic: topic, raw: <<~RAW) }
Somewhere over the rainbow but no poll.
RAW
fab!(:post_with_poll) { Fabricate(:post, topic: topic2, raw: <<~RAW) }
Somewhere over the rainbow with a poll.
[poll]
* Like
* Dislike
[/poll]
RAW
before do
SearchIndexer.enable
Jobs.run_immediately!
SearchIndexer.index(topic2, force: true)
SearchIndexer.index(topic, force: true)
end
after { SearchIndexer.disable }
context "when using in:polls" do
it "displays only posts containing polls" do
results = Search.execute("rainbow in:polls", guardian: Guardian.new)
expect(results.posts).to contain_exactly(post_with_poll)
end
end
context "when polls are disabled" do
it "ignores in:polls filter" do
SiteSetting.poll_enabled = false
results = Search.execute("rainbow in:polls", guardian: Guardian.new)
expect(results.posts).to contain_exactly(regular_post, post_with_poll)
end
end
end