diff --git a/app/models/post_flag.rb b/app/models/post_flag.rb index 96a7a406f..dbb6029ff 100644 --- a/app/models/post_flag.rb +++ b/app/models/post_flag.rb @@ -59,17 +59,9 @@ class PostFlag < ApplicationRecord end def search(params) - q = search_attributes(params, :id, :created_at, :updated_at, :reason, :status, :post) + q = search_attributes(params, :id, :created_at, :updated_at, :reason, :status, :post, :creator) q = q.text_attribute_matches(:reason, params[:reason_matches]) - if params[:creator_id].present? - flagger = User.find(params[:creator_id]) - q = q.creator_matches(flagger, CurrentUser.user) - elsif params[:creator_name].present? - flagger = User.find_by_name(params[:creator_name]) - q = q.creator_matches(flagger, CurrentUser.user) - end - if params[:category] q = q.category_matches(params[:category]) end diff --git a/app/policies/post_flag_policy.rb b/app/policies/post_flag_policy.rb index 50daea170..f20340a37 100644 --- a/app/policies/post_flag_policy.rb +++ b/app/policies/post_flag_policy.rb @@ -14,7 +14,7 @@ class PostFlagPolicy < ApplicationPolicy end def can_view_flagger? - (user.is_moderator? || record.creator_id == user.id) && (record.post&.uploader_id != user.id) + record.creator_id == user.id || (user.is_moderator? && record.post&.uploader_id != user.id) end def permitted_attributes_for_create @@ -30,4 +30,15 @@ class PostFlagPolicy < ApplicationPolicy attributes -= [:creator_id] unless can_view_flagger? attributes end + + def visible_for_search(relation, attribute) + case attribute + in :creator | :creator_id if can_search_flagger? + relation.where(creator: user).or(relation.where.not(post: user.posts)) + in :creator | :creator_id + relation.where(creator: user) + else + relation + end + end end diff --git a/test/functional/post_flags_controller_test.rb b/test/functional/post_flags_controller_test.rb index df5fe3715..09c69343b 100644 --- a/test/functional/post_flags_controller_test.rb +++ b/test/functional/post_flags_controller_test.rb @@ -6,7 +6,7 @@ class PostFlagsControllerTest < ActionDispatch::IntegrationTest @user = create(:user) @flagger = create(:gold_user, id: 999, created_at: 2.weeks.ago) @uploader = create(:mod_user, name: "chen", created_at: 2.weeks.ago) - @mod = create(:mod_user) + @mod = create(:mod_user, name: "mod") @post = create(:post, id: 101, is_flagged: true, uploader: @uploader) @post_flag = create(:post_flag, reason: "xxx", post: @post, creator: @flagger) end @@ -65,6 +65,14 @@ class PostFlagsControllerTest < ActionDispatch::IntegrationTest assert_select "tr#post-flag-#{@post_flag.id} .flagged-column a.user-gold", true end + should "let mods see the flagger name on self-flagged posts" do + @post_flag = create(:post_flag, creator: @mod, post: build(:post, uploader: @mod)) + get_auth post_flags_path, @mod + + assert_response :success + assert_select "tr#post-flag-#{@post_flag.id} .flagged-column a.user-moderator", true + end + context "as a normal user" do setup do CurrentUser.user = @user @@ -99,6 +107,15 @@ class PostFlagsControllerTest < ActionDispatch::IntegrationTest should respond_to_search(creator_id: 999).with { @post_flag } end + context "when the user is a mod and flags their own upload" do + setup do + CurrentUser.user = @mod + @post_flag = create(:post_flag, creator: @mod, post: build(:post, uploader: @mod)) + end + + should respond_to_search(creator_name: "mod").with { @post_flag } + end + context "when the user is the flagger" do setup do CurrentUser.user = @flagger