~cytrogen/masto-fe

60b9fa641d32f2c70d0efc1c30d1d0fdc03f5295 — Claire 2 years ago 3ed2bf9
Fix cached posts including stale stats (#26409)

2 files changed, 34 insertions(+), 2 deletions(-)

M app/models/status.rb
M spec/controllers/concerns/cache_concern_spec.rb
M app/models/status.rb => app/models/status.rb +12 -0
@@ 367,13 367,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


M spec/controllers/concerns/cache_concern_spec.rb => spec/controllers/concerns/cache_concern_spec.rb +22 -2
@@ 13,12 13,17 @@ RSpec.describe CacheConcern 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 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