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
app/helpers/sweeper_helper.rb
... | ... | @@ -8,4 +8,39 @@ module SweeperHelper |
8 | 8 | ActionController::Base.new().expire_timeout_fragment(*args) |
9 | 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 | 46 | end | ... | ... |
app/models/profile.rb
app/sweepers/friendship_sweeper.rb
... | ... | @@ -19,12 +19,12 @@ protected |
19 | 19 | |
20 | 20 | def expire_cache(profile) |
21 | 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 | 23 | (1..pages).each do |i| |
24 | 24 | expire_timeout_fragment(profile.friends_cache_key(:npage => i.to_s)) |
25 | 25 | end |
26 | 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 | 28 | (1..pages).each do |i| |
29 | 29 | expire_timeout_fragment(profile.manage_friends_cache_key(:npage => i.to_s)) |
30 | 30 | end | ... | ... |
... | ... | @@ -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 | 18 | end |
19 | 19 | |
20 | 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 | 23 | expire_timeout_fragment(ck) |
23 | 24 | } |
24 | 25 | ... | ... |