diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index d6188abd14e..b66eb3f0a80 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -56,7 +56,7 @@ class TopicsController < ApplicationController def wordpress params.require(:best) params.require(:topic_id) - params.permit(:min_trust_level, :min_score, :min_replies, :bypass_trust_level_score) + params.permit(:min_trust_level, :min_score, :min_replies, :bypass_trust_level_score, :only_moderator_liked) @topic_view = TopicView.new( params[:topic_id], @@ -65,7 +65,8 @@ class TopicsController < ApplicationController min_trust_level: params[:min_trust_level].nil? ? 1 : params[:min_trust_level].to_i, min_score: params[:min_score].to_i, min_replies: params[:min_replies].to_i, - bypass_trust_level_score: params[:bypass_trust_level_score].to_i # safe cause 0 means ignore + bypass_trust_level_score: params[:bypass_trust_level_score].to_i, # safe cause 0 means ignore + only_moderator_liked: params[:only_moderator_liked].to_s == "true" ) anonymous_etag(@topic_view.topic) do diff --git a/config/routes.rb b/config/routes.rb index 4679da32c09..2b92a97d3dc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -199,6 +199,7 @@ Discourse::Application.routes.draw do # Topic routes get 't/:slug/:topic_id/wordpress' => 'topics#wordpress', constraints: {topic_id: /\d+/} + get 't/:slug/:topic_id/moderator-liked' => 'topics#moderator_liked', constraints: {topic_id: /\d+/} get 't/:topic_id/wordpress' => 'topics#wordpress', constraints: {topic_id: /\d+/} get 't/:slug/:topic_id/best_of' => 'topics#show', defaults: {best_of: true}, constraints: {topic_id: /\d+/, post_number: /\d+/} get 't/:topic_id/best_of' => 'topics#show', constraints: {topic_id: /\d+/, post_number: /\d+/} diff --git a/lib/topic_view.rb b/lib/topic_view.rb index 5e852e70493..b8514445307 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -161,12 +161,9 @@ class TopicView return end - @posts = @filtered_posts.order('percent_rank asc, sort_order asc') - .where("post_number > 1") - + @posts = @filtered_posts.order('percent_rank asc, sort_order asc').where("post_number > 1") @posts = @posts.includes(:reply_to_user).includes(:topic).joins(:user).limit(max) - min_trust_level = opts[:min_trust_level] if min_trust_level && min_trust_level > 0 @@ -187,6 +184,11 @@ class TopicView @posts = @posts.where('posts.score >= ?', min_score) end + if opts[:only_moderator_liked] + liked_by_moderators = PostAction.where(post_id: @filtered_posts.pluck(:id), post_action_type_id: PostActionType.types[:like]) + liked_by_moderators = liked_by_moderators.joins(:user).where('users.moderator').pluck(:post_id) + @posts = @posts.where(id: liked_by_moderators) + end @posts = @posts.to_a @posts.sort!{|a,b| a.post_number <=> b.post_number} diff --git a/spec/components/topic_view_spec.rb b/spec/components/topic_view_spec.rb index 958cb54ac4e..f8f8ac51e8c 100644 --- a/spec/components/topic_view_spec.rb +++ b/spec/components/topic_view_spec.rb @@ -23,6 +23,9 @@ describe TopicView do let!(:p2) { Fabricate(:post, topic: topic, user: coding_horror, percent_rank: 0.5 )} let!(:p3) { Fabricate(:post, topic: topic, user: first_poster, percent_rank: 0 )} + let(:moderator) { Fabricate(:moderator) } + let(:admin) { Fabricate(:admin) + } it "it can find the best responses" do best2 = TopicView.new(topic.id, coding_horror, best: 2) @@ -61,6 +64,21 @@ describe TopicView do # 0 means ignore best = TopicView.new(topic.id, nil, best: 99, bypass_trust_level_score: 0, min_trust_level: coding_horror.trust_level + 1) best.posts.count.should == 0 + + # If we restrict to posts a moderator liked, return none + best = TopicView.new(topic.id, nil, best: 99, only_moderator_liked: true) + best.posts.count.should == 0 + + # It doesn't count likes from admins + PostAction.act(admin, p3, PostActionType.types[:like]) + best = TopicView.new(topic.id, nil, best: 99, only_moderator_liked: true) + best.posts.count.should == 0 + + # It should find the post liked by the moderator + PostAction.act(moderator, p2, PostActionType.types[:like]) + best = TopicView.new(topic.id, nil, best: 99, only_moderator_liked: true) + best.posts.count.should == 1 + end diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb index fff0e271599..22327d72958 100644 --- a/spec/controllers/topics_controller_spec.rb +++ b/spec/controllers/topics_controller_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' describe TopicsController do + context 'wordpress' do let!(:user) { log_in(:moderator) } let(:p1) { Fabricate(:post, user: user) }