Fix cached posts including stale stats (#26409)
This commit is contained in:
		
							parent
							
								
									21bf42bca1
								
							
						
					
					
						commit
						34959eccd2
					
				@ -354,13 +354,25 @@ class Status < ApplicationRecord
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      account_ids.uniq!
 | 
					      account_ids.uniq!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      status_ids = cached_items.map { |item| item.reblog? ? item.reblog_of_id : item.id }.uniq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return if account_ids.empty?
 | 
					      return if account_ids.empty?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      accounts = Account.where(id: account_ids).includes(:account_stat, :user).index_by(&:id)
 | 
					      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|
 | 
					      cached_items.each do |item|
 | 
				
			||||||
        item.account = accounts[item.account_id]
 | 
					        item.account = accounts[item.account_id]
 | 
				
			||||||
        item.reblog.account = accounts[item.reblog.account_id] if item.reblog?
 | 
					        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
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -13,12 +13,17 @@ RSpec.describe CacheConcern, type: :controller do
 | 
				
			|||||||
    def empty_relation
 | 
					    def empty_relation
 | 
				
			||||||
      render plain: cache_collection(Status.none, Status).size
 | 
					      render plain: cache_collection(Status.none, Status).size
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def account_statuses_favourites
 | 
				
			||||||
 | 
					      render plain: cache_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  before do
 | 
					  before do
 | 
				
			||||||
    routes.draw do
 | 
					    routes.draw do
 | 
				
			||||||
      get  'empty_array' => 'anonymous#empty_array'
 | 
					      get 'empty_array' => 'anonymous#empty_array'
 | 
				
			||||||
      post 'empty_relation' => 'anonymous#empty_relation'
 | 
					      get 'empty_relation' => 'anonymous#empty_relation'
 | 
				
			||||||
 | 
					      get 'account_statuses_favourites' => 'anonymous#account_statuses_favourites'
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -36,5 +41,20 @@ RSpec.describe CacheConcern, type: :controller do
 | 
				
			|||||||
        expect(response.body).to eq '0'
 | 
					        expect(response.body).to eq '0'
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    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
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user