forked from fedi/mastodon
Fix error when trying to update counters for statuses that are gone (#8251)
This commit is contained in:
parent
78fa926ed5
commit
d010816ba8
|
@ -32,11 +32,11 @@ class Favourite < ApplicationRecord
|
||||||
private
|
private
|
||||||
|
|
||||||
def increment_cache_counters
|
def increment_cache_counters
|
||||||
status.increment_count!(:favourites_count)
|
status&.increment_count!(:favourites_count)
|
||||||
end
|
end
|
||||||
|
|
||||||
def decrement_cache_counters
|
def decrement_cache_counters
|
||||||
return if association(:status).loaded? && (status.marked_for_destruction? || status.marked_for_mass_destruction?)
|
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
|
||||||
end
|
end
|
||||||
|
|
|
@ -396,6 +396,8 @@ class Status < ApplicationRecord
|
||||||
private
|
private
|
||||||
|
|
||||||
def update_status_stat!(attrs)
|
def update_status_stat!(attrs)
|
||||||
|
return if marked_for_destruction? || destroyed?
|
||||||
|
|
||||||
record = status_stat || build_status_stat
|
record = status_stat || build_status_stat
|
||||||
record.update(attrs)
|
record.update(attrs)
|
||||||
end
|
end
|
||||||
|
@ -456,8 +458,8 @@ class Status < ApplicationRecord
|
||||||
Account.where(id: account_id).update_all('statuses_count = COALESCE(statuses_count, 0) + 1')
|
Account.where(id: account_id).update_all('statuses_count = COALESCE(statuses_count, 0) + 1')
|
||||||
end
|
end
|
||||||
|
|
||||||
reblog.increment_count!(:reblogs_count) if reblog?
|
reblog&.increment_count!(:reblogs_count) if reblog?
|
||||||
thread.increment_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
thread&.increment_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
||||||
end
|
end
|
||||||
|
|
||||||
def decrement_counter_caches
|
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)')
|
Account.where(id: account_id).update_all('statuses_count = GREATEST(COALESCE(statuses_count, 0) - 1, 0)')
|
||||||
end
|
end
|
||||||
|
|
||||||
reblog.decrement_count!(:reblogs_count) if reblog?
|
reblog&.decrement_count!(:reblogs_count) if reblog?
|
||||||
thread.decrement_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && (public_visibility? || unlisted_visibility?)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -182,6 +182,27 @@ RSpec.describe Status, type: :model do
|
||||||
reblog.destroy
|
reblog.destroy
|
||||||
expect(subject.reblogs_count).to eq 0
|
expect(subject.reblogs_count).to eq 0
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe '#favourites_count' do
|
describe '#favourites_count' do
|
||||||
|
|
Loading…
Reference in a new issue