From 86cbb404e947caa4edc1821687486bb788fcaae5 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 21 Jan 2010 11:39:28 +0000 Subject: [PATCH] Add a sweeper to clean up cache entries when a user's visibility or display name changes. --- app/controllers/user_controller.rb | 2 ++ app/models/user_sweeper.rb | 51 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 app/models/user_sweeper.rb 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 -- 2.43.2