Skip to content
Snippets Groups Projects
Unverified Commit d010816b authored by Eugen Rochko's avatar Eugen Rochko Committed by GitHub
Browse files

Fix error when trying to update counters for statuses that are gone (#8251)

parent 78fa926e
No related branches found
No related tags found
No related merge requests found
...@@ -32,11 +32,11 @@ class Favourite < ApplicationRecord ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment