Fix error when trying to update counters for statuses that are gone (#8251)
This commit is contained in:
parent
78fa926ed5
commit
d010816ba8
3 changed files with 29 additions and 6 deletions
|
@ -32,11 +32,11 @@ class Favourite < ApplicationRecord
|
|||
private
|
||||
|
||||
def increment_cache_counters
|
||||
status.increment_count!(:favourites_count)
|
||||
status&.increment_count!(:favourites_count)
|
||||
end
|
||||
|
||||
def decrement_cache_counters
|
||||
return if association(:status).loaded? && (status.marked_for_destruction? || status.marked_for_mass_destruction?)
|
||||
status.decrement_count!(:favourites_count)
|
||||
status&.decrement_count!(:favourites_count)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -396,6 +396,8 @@ class Status < ApplicationRecord
|
|||
private
|
||||
|
||||
def update_status_stat!(attrs)
|
||||
return if marked_for_destruction? || destroyed?
|
||||
|
||||
record = status_stat || build_status_stat
|
||||
record.update(attrs)
|
||||
end
|
||||
|
@ -456,8 +458,8 @@ class Status < ApplicationRecord
|
|||
Account.where(id: account_id).update_all('statuses_count = COALESCE(statuses_count, 0) + 1')
|
||||
end
|
||||
|
||||
reblog.increment_count!(:reblogs_count) if reblog?
|
||||
thread.increment_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
||||
reblog&.increment_count!(:reblogs_count) if reblog?
|
||||
thread&.increment_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
||||
end
|
||||
|
||||
def decrement_counter_caches
|
||||
|
@ -469,7 +471,7 @@ class Status < ApplicationRecord
|
|||
Account.where(id: account_id).update_all('statuses_count = GREATEST(COALESCE(statuses_count, 0) - 1, 0)')
|
||||
end
|
||||
|
||||
reblog.decrement_count!(:reblogs_count) if reblog?
|
||||
thread.decrement_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
||||
reblog&.decrement_count!(:reblogs_count) if reblog?
|
||||
thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -182,6 +182,27 @@ RSpec.describe Status, type: :model do
|
|||
reblog.destroy
|
||||
expect(subject.reblogs_count).to eq 0
|
||||
end
|
||||
|
||||
it 'does not fail when original is deleted before reblog' do
|
||||
reblog = Fabricate(:status, account: bob, reblog: subject)
|
||||
expect(subject.reblogs_count).to eq 1
|
||||
expect { subject.destroy }.to_not raise_error
|
||||
expect(Status.find_by(id: reblog.id)).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe '#replies_count' do
|
||||
it 'is the number of replies' do
|
||||
reply = Fabricate(:status, account: bob, thread: subject)
|
||||
expect(subject.replies_count).to eq 1
|
||||
end
|
||||
|
||||
it 'is decremented when reply is removed' do
|
||||
reply = Fabricate(:status, account: bob, thread: subject)
|
||||
expect(subject.replies_count).to eq 1
|
||||
reply.destroy
|
||||
expect(subject.replies_count).to eq 0
|
||||
end
|
||||
end
|
||||
|
||||
describe '#favourites_count' do
|
||||
|
|
Loading…
Reference in a new issue