diff options
author | Claire <claire.github-309c@sitedethib.com> | 2023-08-17 16:11:48 +0200 |
---|---|---|
committer | Claire <claire.github-309c@sitedethib.com> | 2023-09-19 17:01:17 +0200 |
commit | 31c5e63a58923b9d227d90b48994ed48491dd52e (patch) | |
tree | 9f57f407e0c1b7f2e360a2a02d0d5d5e593528dc | |
parent | e8eeb746ac2d2ec635d46c9c07b73a56b4f2c77c (diff) |
Fix cached posts including stale stats (#26409)
-rw-r--r-- | app/models/status.rb | 12 | ||||
-rw-r--r-- | spec/controllers/concerns/cache_concern_spec.rb | 24 |
2 files changed, 34 insertions, 2 deletions
diff --git a/app/models/status.rb b/app/models/status.rb index 4828d63404b..f9a6ca6397a 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -345,13 +345,25 @@ class Status < ApplicationRecord account_ids.uniq! + status_ids = cached_items.map { |item| item.reblog? ? item.reblog_of_id : item.id }.uniq + return if account_ids.empty? accounts = Account.where(id: account_ids).includes(:account_stat, :user).index_by(&:id) + status_stats = StatusStat.where(status_id: status_ids).index_by(&:status_id) + cached_items.each do |item| item.account = accounts[item.account_id] item.reblog.account = accounts[item.reblog.account_id] if item.reblog? + + if item.reblog? + status_stat = status_stats[item.reblog.id] + item.reblog.status_stat = status_stat if status_stat.present? + else + status_stat = status_stats[item.id] + item.status_stat = status_stat if status_stat.present? + end end end diff --git a/spec/controllers/concerns/cache_concern_spec.rb b/spec/controllers/concerns/cache_concern_spec.rb index a34d7d72676..21daa199210 100644 --- a/spec/controllers/concerns/cache_concern_spec.rb +++ b/spec/controllers/concerns/cache_concern_spec.rb @@ -13,12 +13,17 @@ RSpec.describe CacheConcern, type: :controller do def empty_relation render plain: cache_collection(Status.none, Status).size end + + def account_statuses_favourites + render plain: cache_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count) + end end before do routes.draw do - get 'empty_array' => 'anonymous#empty_array' - post 'empty_relation' => 'anonymous#empty_relation' + get 'empty_array' => 'anonymous#empty_array' + get 'empty_relation' => 'anonymous#empty_relation' + get 'account_statuses_favourites' => 'anonymous#account_statuses_favourites' end end @@ -36,5 +41,20 @@ RSpec.describe CacheConcern, type: :controller do expect(response.body).to eq '0' end end + + context 'when given a collection of statuses' do + let!(:account) { Fabricate(:account) } + let!(:status) { Fabricate(:status, account: account) } + + it 'correctly updates with new interactions' do + get :account_statuses_favourites, params: { id: account.id } + expect(response.body).to eq '[0]' + + FavouriteService.new.call(account, status) + + get :account_statuses_favourites, params: { id: account.id } + expect(response.body).to eq '[1]' + end + end end end |