Commit ef9e77580d5ad74368785dc6df0b5a2f3700063e
Committed by
Antonio Terceiro
1 parent
76fd7b7c
Exists in
master
and in
29 other branches
ActionItem1126: expire relevant caches
created a profile observer that is called by a callback in the model as workaround to some dependencies cycles in environment.rb changed the per_page number to be a Noosfero constant instead of a ProfileController class method
Showing
7 changed files
with
68 additions
and
9 deletions
Show diff stats
app/controllers/public/profile_controller.rb
@@ -105,11 +105,6 @@ class ProfileController < PublicController | @@ -105,11 +105,6 @@ class ProfileController < PublicController | ||
105 | end | 105 | end |
106 | 106 | ||
107 | def per_page | 107 | def per_page |
108 | - self.class.per_page | ||
109 | - end | ||
110 | - class << self | ||
111 | - def per_page | ||
112 | - 10 | ||
113 | - end | 108 | + Noosfero::Constants::PROFILE_PER_PAGE |
114 | end | 109 | end |
115 | end | 110 | end |
app/helpers/sweeper_helper.rb
@@ -8,4 +8,39 @@ module SweeperHelper | @@ -8,4 +8,39 @@ module SweeperHelper | ||
8 | ActionController::Base.new().expire_timeout_fragment(*args) | 8 | ActionController::Base.new().expire_timeout_fragment(*args) |
9 | end | 9 | end |
10 | 10 | ||
11 | + def expire_friends(profile) | ||
12 | + # public friends page | ||
13 | + pages = profile.friends.count / Noosfero::Constants::PROFILE_PER_PAGE + 1 | ||
14 | + (1..pages).each do |i| | ||
15 | + expire_timeout_fragment(profile.friends_cache_key(:npage => i.to_s)) | ||
16 | + end | ||
17 | + # manage friends page | ||
18 | + pages = profile.friends.count / Noosfero::Constants::PROFILE_PER_PAGE + 1 | ||
19 | + (1..pages).each do |i| | ||
20 | + expire_timeout_fragment(profile.manage_friends_cache_key(:npage => i.to_s)) | ||
21 | + end | ||
22 | + | ||
23 | + # friends blocks | ||
24 | + blocks = profile.blocks.select{|b| b.kind_of?(FriendsBlock)} | ||
25 | + blocks.map(&:cache_keys).each{|ck|expire_timeout_fragment(ck)} | ||
26 | + end | ||
27 | + | ||
28 | + def expire_communities(profile) | ||
29 | + # public communities page | ||
30 | + pages = profile.communities.count / Noosfero::Constants::PROFILE_PER_PAGE + 1 | ||
31 | + (1..pages).each do |i| | ||
32 | + expire_timeout_fragment(profile.communities_cache_key(:npage => i.to_s)) | ||
33 | + end | ||
34 | + | ||
35 | + # communities block | ||
36 | + blocks = profile.blocks.select{|b| b.kind_of?(CommunitiesBlock)} | ||
37 | + blocks.map(&:cache_keys).each{|ck|expire_timeout_fragment(ck)} | ||
38 | + end | ||
39 | + | ||
40 | + def expire_enterprises(profile) | ||
41 | + # enterprises and favorite enterprises blocks | ||
42 | + blocks = profile.blocks.select {|b| [EnterprisesBlock, FavoriteEnterprisesBlock].any?{|klass| b.kind_of?(klass)} } | ||
43 | + blocks.map(&:cache_keys).each{|ck|expire_timeout_fragment(ck)} | ||
44 | + end | ||
45 | + | ||
11 | end | 46 | end |
app/models/profile.rb
@@ -633,4 +633,9 @@ class Profile < ActiveRecord::Base | @@ -633,4 +633,9 @@ class Profile < ActiveRecord::Base | ||
633 | end | 633 | end |
634 | end | 634 | end |
635 | 635 | ||
636 | + # FIXME: horrible workaround to circular dependancy in environment.rb | ||
637 | + after_update do |profile| | ||
638 | + ProfileSweeper.new().after_update(profile) | ||
639 | + end | ||
640 | + | ||
636 | end | 641 | end |
app/sweepers/friendship_sweeper.rb
@@ -19,12 +19,12 @@ protected | @@ -19,12 +19,12 @@ protected | ||
19 | 19 | ||
20 | def expire_cache(profile) | 20 | def expire_cache(profile) |
21 | # public friends page | 21 | # public friends page |
22 | - pages = profile.friends.count / ProfileController.per_page + 1 | 22 | + pages = profile.friends.count / Noosfero::Constants::PROFILE_PER_PAGE + 1 |
23 | (1..pages).each do |i| | 23 | (1..pages).each do |i| |
24 | expire_timeout_fragment(profile.friends_cache_key(:npage => i.to_s)) | 24 | expire_timeout_fragment(profile.friends_cache_key(:npage => i.to_s)) |
25 | end | 25 | end |
26 | # manage friends page | 26 | # manage friends page |
27 | - pages = profile.friends.count / FriendsController.per_page + 1 | 27 | + pages = profile.friends.count / Noosfero::Constants::PROFILE_PER_PAGE + 1 |
28 | (1..pages).each do |i| | 28 | (1..pages).each do |i| |
29 | expire_timeout_fragment(profile.manage_friends_cache_key(:npage => i.to_s)) | 29 | expire_timeout_fragment(profile.manage_friends_cache_key(:npage => i.to_s)) |
30 | end | 30 | end |
@@ -0,0 +1,22 @@ | @@ -0,0 +1,22 @@ | ||
1 | +# This is not a proper observer since is explicitly called in the profile model | ||
2 | +class ProfileSweeper # < ActiveRecord::Observer | ||
3 | +# observe :profile | ||
4 | + include SweeperHelper | ||
5 | + | ||
6 | + def after_update(profile) | ||
7 | + expire_caches(profile) | ||
8 | + end | ||
9 | + | ||
10 | +protected | ||
11 | + | ||
12 | + def expire_caches(profile) | ||
13 | + profile.members.each do |member| | ||
14 | + expire_communities(member) if profile.community? | ||
15 | + expire_enterprises(member) if profile.enterprise? | ||
16 | + end | ||
17 | + | ||
18 | + profile.blocks.each do |block| | ||
19 | + expire_timeout_fragment(block.cache_keys) | ||
20 | + end | ||
21 | + end | ||
22 | +end |
app/sweepers/role_assignment_sweeper.rb
@@ -18,7 +18,8 @@ protected | @@ -18,7 +18,8 @@ protected | ||
18 | end | 18 | end |
19 | 19 | ||
20 | def expire_cache(profile) | 20 | def expire_cache(profile) |
21 | - profile.cache_keys(:per_page => ProfileController.per_page).each { |ck| | 21 | + per_page = Noosfero::Constants::PROFILE_PER_PAGE |
22 | + profile.cache_keys(:per_page => per_page).each { |ck| | ||
22 | expire_timeout_fragment(ck) | 23 | expire_timeout_fragment(ck) |
23 | } | 24 | } |
24 | 25 |
lib/noosfero/constants.rb