From e5edd79180cb00c75ea544fbbe1af8f99d524102 Mon Sep 17 00:00:00 2001 From: evazion Date: Thu, 22 Sep 2022 22:31:33 -0500 Subject: [PATCH] flags: fix `flagger:` not returning self-flagged uploads Fix the search `flagger:evazion user:evazion` not returning the user's own self-flagged uploads. Followup to a6e0872ce. Fixes #4690: user profile 'flags' count links to /post_flags with different search criteria --- app/logical/post_query_builder.rb | 2 +- app/models/post.rb | 17 ++--------------- app/models/post_flag.rb | 12 ------------ test/functional/users_controller_test.rb | 2 +- test/unit/post_query_builder_test.rb | 10 ++++++++++ 5 files changed, 14 insertions(+), 29 deletions(-) diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 7b181e16b..61aafd0d2 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -170,7 +170,7 @@ class PostQueryBuilder when "approver" relation.approver_matches(value) when "flagger" - relation.flagger_matches(value, current_user) + relation.user_subquery_matches(PostFlag.unscoped.category_matches("normal"), value, current_user) when "appealer" relation.user_subquery_matches(PostAppeal.unscoped, value, current_user) when "commenter", "comm" diff --git a/app/models/post.rb b/app/models/post.rb index 60c4c435d..a9dce2011 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1350,31 +1350,18 @@ class Post < ApplicationRecord end end - def flagger_matches(username, current_user) - flags = PostFlag.unscoped.category_matches("normal") - - user_subquery_matches(flags, username) do |username| - flagger = User.find_by_name(username) - PostFlag.unscoped.creator_matches(flagger, current_user) - end - end - - def user_subquery_matches(subquery, username, current_user, field: :creator, &block) + def user_subquery_matches(subquery, username, current_user, field: :creator) subquery = subquery.where("post_id = posts.id").select(1) if username.downcase == "any" where("EXISTS (#{subquery.to_sql})") elsif username.downcase == "none" where("NOT EXISTS (#{subquery.to_sql})") - elsif block.nil? + else user = User.find_by_name(username) return none if user.nil? subquery = subquery.visible_for_search(field, current_user).where(field => user) where("EXISTS (#{subquery.to_sql})") - else - subquery = subquery.merge(block.call(username)) - return none if subquery.to_sql.blank? - where("EXISTS (#{subquery.to_sql})") end end diff --git a/app/models/post_flag.rb b/app/models/post_flag.rb index a11ab2a92..236d387e9 100644 --- a/app/models/post_flag.rb +++ b/app/models/post_flag.rb @@ -31,18 +31,6 @@ class PostFlag < ApplicationRecord scope :active, -> { pending.or(rejected.in_cooldown) } module SearchMethods - def creator_matches(creator, searcher) - return none if creator.nil? - - policy = Pundit.policy!(searcher, PostFlag.unscoped.new(creator: creator)) - - if policy.can_view_flagger? - where(creator: creator).where.not(post: searcher.posts) - else - none - end - end - def category_matches(category) case category when "normal" diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb index 05d403fbe..2771aa7f5 100644 --- a/test/functional/users_controller_test.rb +++ b/test/functional/users_controller_test.rb @@ -220,7 +220,7 @@ class UsersControllerTest < ActionDispatch::IntegrationTest get_auth profile_path, @user, as: :json assert_response :success - assert_equal(@user.comment_count, response.parsed_body["comment_count"]) + assert_equal(@user.comments.count, response.parsed_body["comment_count"]) end should "redirect anonymous users to the sign in page" do diff --git a/test/unit/post_query_builder_test.rb b/test/unit/post_query_builder_test.rb index 9e38d4a84..bdb09aa0f 100644 --- a/test/unit/post_query_builder_test.rb +++ b/test/unit/post_query_builder_test.rb @@ -465,6 +465,16 @@ class PostQueryBuilderTest < ActiveSupport::TestCase assert_tag_match([], "flagger:does_not_exist") end + should "return self-flagged posts for the flagger: metatag" do + flagger = create(:user) + posts = create_list(:post, 2, uploader: flagger) + flag = create(:post_flag, post: posts[0], creator: flagger) + + assert_tag_match([], "flagger:#{flagger.name} user:#{flagger.name}", current_user: User.anonymous) + assert_tag_match([posts[0]], "flagger:#{flagger.name} user:#{flagger.name}", current_user: flagger) + assert_tag_match([posts[0]], "flagger:#{flagger.name} user:#{flagger.name}", current_user: create(:mod_user)) + end + should "return posts for the commenter: metatag" do users = create_list(:user, 2, created_at: 2.weeks.ago) posts = create_list(:post, 2)