diff --git a/Gemfile.lock b/Gemfile.lock index 8e2f1670..f249239f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -37,7 +37,7 @@ GIT GIT remote: git://github.com/matchu/flex.git - revision: d62f508f795ecdbb383f406865daa72368b43ba5 + revision: 6d7e3fd6e2845ae978545be67b912323888d1ebb specs: flex (0.4.1) multi_json (~> 1.3.4) @@ -186,7 +186,7 @@ GEM patron (0.4.18) polyglot (0.3.3) progressbar (0.11.0) - prompter (0.1.5) + prompter (0.1.6) dye (>= 0.1.1) yard (>= 0.6.3) rack (1.4.5) @@ -292,7 +292,7 @@ GEM activesupport (>= 2.3.4) chronic (~> 0.6.3) will_paginate (3.0.4) - yard (0.8.5.2) + yard (0.8.7.3) PLATFORMS ruby diff --git a/app/models/item.rb b/app/models/item.rb index e467b3d4..763a0418 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -41,7 +41,8 @@ class Item < ActiveRecord::Base scope :with_closet_hangers, joins(:closet_hangers) - flex.sync self + # Syncing is now handled in background tasks, created in the ItemObserver. + flex.sync self, callbacks: [] def flex_source indexed_attributes = { diff --git a/app/models/item/create_task.rb b/app/models/item/create_task.rb new file mode 100644 index 00000000..094deca9 --- /dev/null +++ b/app/models/item/create_task.rb @@ -0,0 +1,21 @@ +class Item + class CreateTask + extend FragmentExpiration + + TIMEOUT_IN_SECONDS = 10 + + @queue = :item_create + + def self.perform(id) + Timeout::timeout(TIMEOUT_IN_SECONDS) do + Item.find(id).flex.sync + expire_newest_items + end + end + + def self.expire_newest_items + expire_fragment_in_all_locales('outfits#new newest_items') + expire_fragment_in_all_locales('items#index newest_items') + end + end +end \ No newline at end of file diff --git a/app/models/item/destroy_task.rb b/app/models/item/destroy_task.rb new file mode 100644 index 00000000..e3eb5caf --- /dev/null +++ b/app/models/item/destroy_task.rb @@ -0,0 +1,17 @@ +class Item + class DestroyTask + extend FragmentExpiration + + TIMEOUT_IN_SECONDS = 10 + + @queue = :item_destroy + + def self.perform(id) + Timeout::timeout(TIMEOUT_IN_SECONDS) do + Item.find(id).flex.sync + # TODO: it's kinda ugly to reach across classes like this + CreateTask.expire_newest_items + end + end + end +end \ No newline at end of file diff --git a/app/models/item/update_task.rb b/app/models/item/update_task.rb new file mode 100644 index 00000000..2267b2c0 --- /dev/null +++ b/app/models/item/update_task.rb @@ -0,0 +1,26 @@ +class Item + class UpdateTask + extend FragmentExpiration + + TIMEOUT_IN_SECONDS = 10 + + @queue = :item_update + + def self.perform(id) + Timeout::timeout(TIMEOUT_IN_SECONDS) do + item = Item.find(id) + expire_cache_for(item) + item.flex.sync + end + end + + private + + def self.expire_cache_for(item) + expire_fragment_in_all_locales("items/#{item.id}#item_link_partial") + expire_fragment_in_all_locales("items/#{item.id} header") + expire_fragment_in_all_locales("items/#{item.id} info") + expire_key_in_all_locales("items/#{item.id}#as_json") + end + end +end \ No newline at end of file diff --git a/app/models/item_observer.rb b/app/models/item_observer.rb index ee68cc30..28bff4b1 100644 --- a/app/models/item_observer.rb +++ b/app/models/item_observer.rb @@ -2,31 +2,15 @@ class ItemObserver < ActionController::Caching::Sweeper include FragmentExpiration def after_create(item) - Rails.logger.debug "Item #{item.id} was just created" - expire_newest_items + Resque.enqueue(Item::CreateTask, item.id) end def after_update(item) - Rails.logger.debug "Item #{item.id} was just updated" - expire_cache_for(item) + # CONSIDER: can pass item.changes.keys in to choose which caches to expire + Resque.enqueue(Item::UpdateTask, item.id) end def after_destroy(item) - Rails.logger.debug "Item #{item.id} was just destroyed" - expire_cache_for(item) - end - - private - - def expire_cache_for(item) - expire_fragment_in_all_locales("items/#{item.id}#item_link_partial") - expire_fragment_in_all_locales("items/#{item.id} header") - expire_fragment_in_all_locales("items/#{item.id} info") - expire_key_in_all_locales("items/#{item.id}#as_json") - end - - def expire_newest_items - expire_fragment_in_all_locales('outfits#new newest_items') - expire_fragment_in_all_locales('items#index newest_items') + Resque.enqueue(Item::DestroyTask, item.id) end end diff --git a/vendor/cache/prompter-0.1.5.gem b/vendor/cache/prompter-0.1.5.gem deleted file mode 100644 index 82ff55f6..00000000 Binary files a/vendor/cache/prompter-0.1.5.gem and /dev/null differ diff --git a/vendor/cache/prompter-0.1.6.gem b/vendor/cache/prompter-0.1.6.gem new file mode 100644 index 00000000..d626fc8b Binary files /dev/null and b/vendor/cache/prompter-0.1.6.gem differ diff --git a/vendor/cache/yard-0.8.5.2.gem b/vendor/cache/yard-0.8.5.2.gem deleted file mode 100644 index f5d7160b..00000000 Binary files a/vendor/cache/yard-0.8.5.2.gem and /dev/null differ diff --git a/vendor/cache/yard-0.8.7.3.gem b/vendor/cache/yard-0.8.7.3.gem new file mode 100644 index 00000000..e2e0dfa6 Binary files /dev/null and b/vendor/cache/yard-0.8.7.3.gem differ