From c36e201eb3559a489a3d3e4905e0f4d04c12cc2c Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 4 Apr 2018 12:01:56 +0530 Subject: [PATCH] FIX: update categories topic_count when converting topic to a PM and vice versa --- app/models/topic_converter.rb | 8 ++++++++ spec/models/topic_converter_spec.rb | 10 ++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/models/topic_converter.rb b/app/models/topic_converter.rb index aed196943a8..76704a7a8ce 100644 --- a/app/models/topic_converter.rb +++ b/app/models/topic_converter.rb @@ -24,6 +24,7 @@ class TopicConverter @topic.archetype = Archetype.default @topic.save update_user_stats + update_category_topic_count_by(1) # TODO: Every post in a PRIVATE MESSAGE looks the same: each is a UserAction::NEW_PRIVATE_MESSAGE. # So we need to remove all those user actions and re-log all the posts. @@ -46,6 +47,7 @@ class TopicConverter def convert_to_private_message Topic.transaction do + update_category_topic_count_by(-1) @topic.category_id = nil @topic.archetype = Archetype.private_message add_allowed_users @@ -92,4 +94,10 @@ class TopicConverter end end + def update_category_topic_count_by(num) + if @topic.category_id.present? + Category.where(['id = ?', @topic.category_id]).update_all("topic_count = topic_count " + (num > 0 ? '+' : '') + "#{num}") + end + end + end diff --git a/spec/models/topic_converter_spec.rb b/spec/models/topic_converter_spec.rb index 66e2c94380d..adbe5e911d4 100644 --- a/spec/models/topic_converter_spec.rb +++ b/spec/models/topic_converter_spec.rb @@ -5,7 +5,7 @@ describe TopicConverter do context 'convert_to_public_topic' do let(:admin) { Fabricate(:admin) } let(:author) { Fabricate(:user) } - let(:category) { Fabricate(:category) } + let(:category) { Fabricate(:category, topic_count: 1) } let(:private_message) { Fabricate(:private_message_topic, user: author) } # creates a topic without a first post let(:first_post) { Fabricate(:post, topic: private_message, user: author) } let(:other_user) { private_message.topic_allowed_users.find { |u| u.user != author }.user } @@ -19,6 +19,7 @@ describe TopicConverter do expect(topic).to be_valid expect(topic.archetype).to eq("regular") expect(topic.category_id).to eq(SiteSetting.uncategorized_category_id) + expect(topic.category.topic_count).to eq(1) end describe 'when uncategorized category is not allowed' do @@ -38,6 +39,7 @@ describe TopicConverter do .where(read_restricted: false).order('id asc').first expect(topic.category_id).to eq(first_category.id) + expect(topic.category.topic_count).to eq(2) end end @@ -46,6 +48,7 @@ describe TopicConverter do topic = TopicConverter.new(private_message, admin).convert_to_public_topic(category.id) expect(topic.reload.category).to eq(category) + expect(topic.category.topic_count).to eq(2) end end @@ -86,13 +89,16 @@ describe TopicConverter do context 'convert_to_private_message' do let(:admin) { Fabricate(:admin) } let(:author) { Fabricate(:user) } - let(:topic) { Fabricate(:topic, user: author) } + let(:category) { Fabricate(:category) } + let(:topic) { Fabricate(:topic, user: author, category_id: category.id) } context 'success' do it "converts regular topic to private message" do private_message = topic.convert_to_private_message(admin) expect(private_message).to be_valid expect(topic.archetype).to eq("private_message") + expect(topic.category_id).to eq(nil) + expect(category.topic_count).to eq(0) end it "updates user stats" do