PERF: Cache categories query in `Stylesheet::Manager.color_scheme_digest`.

PERF: Cache categories query in Stylesheet::Manager.color_scheme_digest.

The query is being executed each time we try and generate the link path for a stylesheet within the duration of a reqeust. Categories are not updated that often so repeating this query multiple times a request is wasteful.

At the time of this commit, there is a publish_discourse_stylesheet ActiveRecord callback on the Category model which clears the cache of Stylesheet::Manager each time a category is saved.

diff --git a/lib/stylesheet/manager.rb b/lib/stylesheet/manager.rb
index 86e2552..6b916e9 100644
--- a/lib/stylesheet/manager.rb
+++ b/lib/stylesheet/manager.rb
@@ -436,15 +436,21 @@ class Stylesheet::Manager
   end
 
   def color_scheme_digest
-
     cs = @color_scheme || theme&.color_scheme
 
-    category_updated = Category.where("uploaded_background_id IS NOT NULL").pluck(:updated_at).map(&:to_i).sum
+    categories_updated = self.class.cache["categories_updated"] ||= begin
+      Category
+        .where("uploaded_background_id IS NOT NULL")
+        .pluck(:updated_at)
+        .map(&:to_i)
+        .sum
+    end
+
     fonts = "#{SiteSetting.base_font}-#{SiteSetting.heading_font}"
 
-    if cs || category_updated > 0
+    if cs || categories_updated > 0
       theme_color_defs = theme&.resolve_baked_field(:common, :color_definitions)
-      Digest::SHA1.hexdigest "#{RailsMultisite::ConnectionManagement.current_db}-#{cs&.id}-#{cs&.version}-#{theme_color_defs}-#{Stylesheet::Manager.last_file_updated}-#{category_updated}-#{fonts}"
+      Digest::SHA1.hexdigest "#{RailsMultisite::ConnectionManagement.current_db}-#{cs&.id}-#{cs&.version}-#{theme_color_defs}-#{Stylesheet::Manager.last_file_updated}-#{categories_updated}-#{fonts}"
     else
       digest_string = "defaults-#{Stylesheet::Manager.last_file_updated}-#{fonts}"
 

GitHub sha: 6a79864f

This commit appears in #13246 which was approved by SamSaffron. It was merged by tgxworld.