From: Tom Hughes Date: Thu, 21 Jan 2010 11:39:28 +0000 (+0000) Subject: Add a sweeper to clean up cache entries when a user's visibility or X-Git-Tag: live~7361^2~2 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/86cbb404e947caa4edc1821687486bb788fcaae5?ds=inline Add a sweeper to clean up cache entries when a user's visibility or display name changes. --- diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index ca84d7701..ca0046762 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -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 index 000000000..84373be74 --- /dev/null +++ b/app/models/user_sweeper.rb @@ -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