From af03873d37decf8dba4278fc38bfcde7747a79f4 Mon Sep 17 00:00:00 2001 From: Natalie Tay Date: Mon, 24 Mar 2025 17:40:15 +0800 Subject: [PATCH] DEV: Allow loading topic associations on /categories (#31954) `/categories` sometimes returns accompanying topics under certain site settings. The `CategoryList` currently allows preloading for topic custom fields via `preloaded_topic_custom_fields`, but not for topics themselves. This addition is required for https://github.com/discourse/discourse-solved/pull/342. --- app/models/category_list.rb | 5 ++++- lib/discourse_plugin_registry.rb | 1 + lib/plugin/instance.rb | 6 ++++++ spec/models/category_list_spec.rb | 27 +++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/models/category_list.rb b/app/models/category_list.rb index de887c08c9c..cdf844de00e 100644 --- a/app/models/category_list.rb +++ b/app/models/category_list.rb @@ -106,7 +106,10 @@ class CategoryList ) end - @all_topics = TopicQuery.remove_muted_tags(@all_topics, @guardian.user).includes(:last_poster) + inclusions = [:last_poster] + preload = DiscoursePluginRegistry.category_list_topics_preloader_associations + inclusions.concat(preload) if preload.present? + @all_topics = TopicQuery.remove_muted_tags(@all_topics, @guardian.user).includes(inclusions) end def find_relevant_topics diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index 7c8fcd44d20..57c94821298 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -91,6 +91,7 @@ class DiscoursePluginRegistry define_filtered_register :topic_thumbnail_sizes define_filtered_register :topic_preloader_associations + define_filtered_register :category_list_topics_preloader_associations define_filtered_register :api_parameter_routes define_filtered_register :api_key_scope_mappings diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index cdbf6113f57..f1669754382 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -1442,6 +1442,12 @@ class Plugin::Instance DiscoursePluginRegistry.register_topic_preloader_association(fields, self) end + # When loading /categories with topics, preload topic associations + # using register_category_list_topics_preloader_associations(:association_name) + def register_category_list_topics_preloader_associations(fields) + DiscoursePluginRegistry.register_category_list_topics_preloader_association(fields, self) + end + private def setting_category diff --git a/spec/models/category_list_spec.rb b/spec/models/category_list_spec.rb index 753e2c1ad65..653d617be9a 100644 --- a/spec/models/category_list_spec.rb +++ b/spec/models/category_list_spec.rb @@ -471,4 +471,31 @@ RSpec.describe CategoryList do end end end + + describe "with displayable topics" do + fab!(:category) { Fabricate(:category, num_featured_topics: 2) } + fab!(:topic) { Fabricate(:topic, category: category) } + + it "preloads topic associations" do + DiscoursePluginRegistry.register_category_list_topics_preloader_association( + :first_post, + Plugin::Instance.new, + ) + + category = Fabricate(:category_with_definition) + Fabricate(:topic, category: category) + + CategoryFeaturedTopic.feature_topics + + displayable_topics = + CategoryList + .new(Guardian.new(admin), include_topics: true) + .categories + .find { |x| x.id == category.id } + .displayable_topics + expect(displayable_topics.first.association(:first_post).loaded?).to eq(true) + + DiscoursePluginRegistry.reset_register!(:category_list_topics_preloader_associations) + end + end end