Add a sweeper to clean up cache entries when a user's visibility or
authorTom Hughes <tom@compton.nu>
Thu, 21 Jan 2010 11:39:28 +0000 (11:39 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 21 Jan 2010 11:39:28 +0000 (11:39 +0000)
display name changes.

app/controllers/user_controller.rb
app/models/user_sweeper.rb [new file with mode: 0644]

index ca84d770199b347dc88a9f7555d30b25c4f6cce3..ca004676219f52b0fccc0c73267b83a2093ee7a1 100644 (file)
@@ -16,6 +16,8 @@ class UserController < ApplicationController
 
   filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
 
+  cache_sweeper :user_sweeper, :only => [:account, :hide, :unhide, :delete]
+
   def save
     @title = t 'user.new.title'
 
diff --git a/app/models/user_sweeper.rb b/app/models/user_sweeper.rb
new file mode 100644 (file)
index 0000000..84373be
--- /dev/null
@@ -0,0 +1,51 @@
+class UserSweeper < ActionController::Caching::Sweeper
+  observe User
+
+  def before_update(record)
+    expire_cache_for(User.find(record.id), record)
+  end
+
+  def before_destroy(record)
+    expire_cache_for(record, nil)
+  end
+
+private
+
+  def expire_cache_for(old_record, new_record)
+    if old_record and
+        (new_record.nil? or
+         old_record.visible != new_record.visible or
+         old_record.display_name != new_record.display_name)
+      old_record.diary_entries.each do |entry|
+        expire_action(:controller => 'diary_entry', :action => 'view', :id => entry.id)
+        expire_action(:controller => 'diary_entry', :action => 'list', :language => entry.language_code, :display_name => nil)
+        expire_action(:controller => 'diary_entry', :action => 'rss', :language => entry.language_code, :display_name => nil)
+      end
+
+      expire_action(:controller => 'diary_entry', :action => 'list', :language => nil, :display_name => nil)
+      expire_action(:controller => 'diary_entry', :action => 'list', :language => nil, :display_name => old_record.display_name)
+
+      expire_action(:controller => 'diary_entry', :action => 'rss', :language => nil, :display_name => nil)
+      expire_action(:controller => 'diary_entry', :action => 'rss', :language => nil, :display_name => old_record.display_name)
+
+      old_record.traces.each do |trace|
+        expire_action(:controller => 'trace', :action => 'view', :id => trace.id)
+        expire_action(:controller => 'trace', :action => 'view', :display_name => old_record.display_name, :id => trace.id)
+
+        trace.tags.each do |tag|
+          expire_action(:controller => 'trace', :action => 'list', :display_name => nil, :tag => tag.tag)
+          expire_action(:controller => 'trace', :action => 'list', :display_name => old_record.display_name, :tag => tag.tag)
+
+          expire_action(:controller => 'trace', :action => 'georss', :display_name => nil, :tag => tag.tag)
+          expire_action(:controller => 'trace', :action => 'georss', :display_name => old_record.display_name, :tag => tag.tag)
+        end
+      end
+
+      expire_action(:controller => 'trace', :action => 'list', :display_name => nil, :tag => nil)
+      expire_action(:controller => 'trace', :action => 'list', :display_name => old_record.display_name, :tag => nil)
+
+      expire_action(:controller => 'trace', :action => 'georss', :display_name => nil, :tag => nil)
+      expire_action(:controller => 'trace', :action => 'georss', :display_name => old_record.display_name, :tag => nil)
+    end
+  end
+end