diff --git a/app/controllers/moderations_controller.rb b/app/controllers/moderations_controller.rb index e05cab682..7f1e9123f 100644 --- a/app/controllers/moderations_controller.rb +++ b/app/controllers/moderations_controller.rb @@ -17,8 +17,14 @@ class ModerationsController < ApplicationController @feed = params[:state] == "latest" ? "latest" : "inbox" @members = params[:members].in?(%w[new not_new]) ? params[:members] : "all" + + # exclude articles from users that have suspended or spam role + role_ids = Role.where(name: %i[spam suspended]).ids articles = Article.published + .where("NOT EXISTS (SELECT 1 FROM users_roles WHERE users_roles.user_id = articles.user_id AND + role_id IN (?))", role_ids) .order(published_at: :desc).limit(70) + articles = articles.cached_tagged_with(params[:tag]) if params[:tag].present? if @feed == "inbox" articles = articles diff --git a/spec/requests/moderations_spec.rb b/spec/requests/moderations_spec.rb index 8b3f20c2d..a6fb986d8 100644 --- a/spec/requests/moderations_spec.rb +++ b/spec/requests/moderations_spec.rb @@ -173,26 +173,43 @@ RSpec.describe "Moderations" do end context "when user is trusted" do + let!(:first_article) { create(:article) } + let!(:second_article) { create(:article, score: -12) } + let(:spamer) { create(:user, :spam) } + let(:suspended_user) { create(:user, :suspended) } + before do sign_in trusted_user end it "does not show articles the user has already reacted to for inbox" do - first_article = create(:article) - second_article = create(:article, score: -12) get "/mod" expect(response.body).to include(CGI.escapeHTML(first_article.title)) expect(response.body).not_to include(CGI.escapeHTML(second_article.title)) end - it "shows all articles on latest" do - first_article = create(:article) - second_article = create(:article, score: -12) + it "doesn't include spam and suspended articles" do + spam_article = create(:article, user: spamer, score: 0) + suspended_article = create(:article, user: suspended_user, score: 0) + + get "/mod" + + expect(response.body).to include(CGI.escapeHTML(first_article.title)) + expect(response.body).not_to include(CGI.escapeHTML(spam_article.title)) + expect(response.body).not_to include(CGI.escapeHTML(suspended_article.title)) + end + + it "includes non-spam articles and doesn't include spam/suspended articles on latest" do + spam_article = create(:article, user: spamer, score: 0) + suspended_article = create(:article, user: suspended_user, score: 0) + get "/mod?state=latest" expect(response.body).to include(CGI.escapeHTML(first_article.title)) expect(response.body).to include(CGI.escapeHTML(second_article.title)) + expect(response.body).not_to include(CGI.escapeHTML(spam_article.title)) + expect(response.body).not_to include(CGI.escapeHTML(suspended_article.title)) end end end