diff --git a/app/lib/plugin_initializer.rb b/app/lib/plugin_initializer.rb index 1d49f4a..f3aa8f8 100644 --- a/app/lib/plugin_initializer.rb +++ b/app/lib/plugin_initializer.rb @@ -14,16 +14,15 @@ def apply_plugin_api end end - class AssignsRemainderForTopicsQuery < PluginInitializer + class AssignsReminderForTopicsQuery < PluginInitializer def apply_plugin_api plugin.register_modifier(:assigns_reminder_assigned_topics_query) do |query| next query if !SiteSetting.ignore_solved_topics_in_assigned_reminder - query.where( - "topics.id NOT IN ( - SELECT topic_id - FROM topic_custom_fields - WHERE name = 'accepted_answer_post_id' - )", + query.where.not( + id: + TopicCustomField.where( + name: ::DiscourseSolved::ACCEPTED_ANSWER_POST_ID_CUSTOM_FIELD, + ).pluck(:topic_id), ) end end diff --git a/plugin.rb b/plugin.rb index a6ad385..f16205d 100644 --- a/plugin.rb +++ b/plugin.rb @@ -47,6 +47,8 @@ class Engine < ::Rails::Engine require_relative "app/lib/web_hook_extension" require_relative "app/serializers/concerns/topic_answer_mixin" + require_relative "app/lib/plugin_initializer" + DiscourseSolved::AssignsReminderForTopicsQuery.new(self).apply_plugin_api module ::DiscourseSolved def self.accept_answer!(post, acting_user, topic: nil) topic ||= post.topic diff --git a/spec/integration/solved_spec.rb b/spec/integration/solved_spec.rb index 6b2db17..bc830c7 100644 --- a/spec/integration/solved_spec.rb +++ b/spec/integration/solved_spec.rb @@ -397,4 +397,30 @@ expect(p1.topic.assignment.reload.status).to eq("Done") end end + + context "with using assigns_reminder_assigned_topics_query modifier" do + class DummyClass + def test + DiscoursePluginRegistry.apply_modifier(:assigns_reminder_assigned_topics_query, Topic.all) + end + end + + before { SiteSetting.ignore_solved_topics_in_assigned_reminder = true } + + it "should not include solved topics in the query" do + topic = Fabricate(:topic) + topic2 = Fabricate(:topic) + topic3 = Fabricate(:topic) + post = Fabricate(:post, topic: topic) + + DiscourseSolved.accept_answer!(post, Discourse.system_user) + + topics = DummyClass.new.test.to_a + + expect(topics).not_to include(topic) + + expect(topics).to include(topic2) + expect(topics).to include(topic3) + end + end end