From 32aa821f12c16c5ac5aac51ab340616ed15b8b43 Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Wed, 22 Mar 2023 15:12:08 -0500 Subject: [PATCH] DEV: Add preload API to CategoryList (#20778) --- app/models/category_list.rb | 21 ++++++++++++++++++++- spec/models/category_list_spec.rb | 15 +++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/models/category_list.rb b/app/models/category_list.rb index 38a55042a78..5f6a125a73d 100644 --- a/app/models/category_list.rb +++ b/app/models/category_list.rb @@ -8,6 +8,21 @@ class CategoryList attr_accessor :categories, :uncategorized + def self.on_preload(&blk) + (@preload ||= Set.new) << blk + end + + def self.cancel_preload(&blk) + if @preload + @preload.delete blk + @preload = nil if @preload.length == 0 + end + end + + def self.preload(category_list) + @preload.each { |preload| preload.call(category_list) } if @preload + end + def initialize(guardian = nil, options = {}) @guardian = guardian || Guardian.new @options = options @@ -111,7 +126,11 @@ class CategoryList :uploaded_logo_dark, :topic_only_relative_url, subcategories: [:topic_only_relative_url], - ).secured(@guardian) + ) + + CategoryList.preload(self) + + @categories = @categories.secured(@guardian) @categories = @categories.where( diff --git a/spec/models/category_list_spec.rb b/spec/models/category_list_spec.rb index e712d1ea378..b331c78f3d9 100644 --- a/spec/models/category_list_spec.rb +++ b/spec/models/category_list_spec.rb @@ -12,6 +12,21 @@ RSpec.describe CategoryList do fab!(:admin) { Fabricate(:admin) } let(:category_list) { CategoryList.new(Guardian.new(user), include_topics: true) } + describe "preload" do + it "allows preloading of data" do + preloaded_list = nil + preloader = lambda { |view| preloaded_list = view } + + CategoryList.on_preload(&preloader) + + expect(preloaded_list).to eq(nil) + category_list + expect(preloaded_list).to eq(preloaded_list) + + CategoryList.cancel_preload(&preloader) + end + end + describe "security" do it "properly hide secure categories" do cat = Fabricate(:category_with_definition)