From c26d392b1a160ae357a63cf160daeb81a0dd8ece Mon Sep 17 00:00:00 2001 From: Drew Blessing <drew.blessing@buckle.com> Date: Wed, 11 Dec 2013 09:30:22 -0600 Subject: [PATCH] Expire event cache on avatar creation/removal --- CHANGELOG | 1 + app/controllers/profiles/avatars_controller.rb | 2 ++ app/models/user.rb | 14 ++++++++++++++ app/uploaders/attachment_uploader.rb | 6 ++++++ 4 files changed, 23 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 3fa5143d43f..e62697410a8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,7 @@ v 6.4.0 - Allow removal of avatar (Drew Blessing) - Project web hooks now support issues and merge request events - Visiting project page while not logged in will redirect to sign-in instead of 404 (Jason Hollingsworth) + - Expire event cache on avatar creation/removal (Drew Blessing) v 6.3.0 - API for adding gitlab-ci service diff --git a/app/controllers/profiles/avatars_controller.rb b/app/controllers/profiles/avatars_controller.rb index e90eaafd440..57f3bbf0627 100644 --- a/app/controllers/profiles/avatars_controller.rb +++ b/app/controllers/profiles/avatars_controller.rb @@ -6,6 +6,8 @@ class Profiles::AvatarsController < ApplicationController @user.remove_avatar! @user.save + @user.reset_events_cache + redirect_to profile_path end end diff --git a/app/models/user.rb b/app/models/user.rb index f1f68d5f424..25a04089d33 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -404,4 +404,18 @@ class User < ActiveRecord::Base project.namespace != namespace && project.project_member(self) end + + # Reset project events cache related to this user + # + # Since we do cache @event we need to reset cache in special cases: + # * when the user changes their avatar + # Events cache stored like events/23-20130109142513. + # The cache key includes updated_at timestamp. + # Thus it will automatically generate a new fragment + # when the event is updated because the key changes. + def reset_events_cache + Event.where(author_id: self.id). + order('id DESC').limit(1000). + update_all(updated_at: Time.now) + end end diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb index 98794c9470b..b122b6c8658 100644 --- a/app/uploaders/attachment_uploader.rb +++ b/app/uploaders/attachment_uploader.rb @@ -3,6 +3,8 @@ class AttachmentUploader < CarrierWave::Uploader::Base storage :file + after :store, :reset_events_cache + def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end @@ -27,4 +29,8 @@ class AttachmentUploader < CarrierWave::Uploader::Base def file_storage? self.class.storage == CarrierWave::Storage::File end + + def reset_events_cache(file) + model.reset_events_cache if model.is_a?(User) + end end -- GitLab