diff --git a/app/serializers/admin_user_action_serializer.rb b/app/serializers/admin_user_action_serializer.rb index 4dd05564baf..1bff61203db 100644 --- a/app/serializers/admin_user_action_serializer.rb +++ b/app/serializers/admin_user_action_serializer.rb @@ -52,15 +52,15 @@ class AdminUserActionSerializer < ApplicationSerializer end def slug - object.topic&.slug + topic&.slug end def title - object.topic&.title + topic&.title end def category_id - object.topic&.category_id + topic&.category_id end def moderator_action @@ -80,4 +80,14 @@ class AdminUserActionSerializer < ApplicationSerializer .select { |ua| [UserAction::REPLY, UserAction::RESPONSE].include? ua.action_type } .first.try(:action_type) end + + # we need this to handle deleted topics which aren't loaded via + # Topic.unscoped do + # Post.includes(:topic) + # end + # because Rails 4 "unscoped" support is still bugged (cf. https://github.com/rails/rails/issues/13775) + def topic + return @topic if @topic + @topic = object.topic || Topic.with_deleted.find_by_id(object.topic_id) + end end diff --git a/spec/serializers/admin_user_action_serializer_spec.rb b/spec/serializers/admin_user_action_serializer_spec.rb new file mode 100644 index 00000000000..371e76468a7 --- /dev/null +++ b/spec/serializers/admin_user_action_serializer_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +describe AdminUserActionSerializer do + fab!(:user) { Fabricate(:user) } + fab!(:admin) { Fabricate(:admin) } + let(:guardian) { Guardian.new(admin) } + + fab!(:topic) { Fabricate(:topic) } + fab!(:post) { Fabricate(:post, topic: topic) } + + it "includes the slug/title/category ID for a post's deleted topic" do + topic.trash! + + json = AdminUserActionSerializer.new(post, scope: guardian, root: false).as_json + + expect(json[:slug]).to eq(topic.slug) + expect(json[:title]).to eq(topic.title) + expect(json[:category_id]).to eq(topic.category_id) + end +end