]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/user_sweeper.rb
Add a sweeper to clean up cache entries when a user's visibility or
[rails.git] / app / models / user_sweeper.rb
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