discourse/app/controllers/admin/flags_controller.rb
Robin Ward bc3efab816 FIX: When disagreeing with a flag that silenced a user, unsilence them
Previously it would unhide their post but leave them silenced.

This fix also cleans up some of the helper classes to make it easier
to pass extra data to the silencing code (for example, a link to the
post that caused the user to be silenced.)

This patch also refactors the auto_silence specs to avoid using
stubs.
2019-02-08 08:50:50 -05:00

148 lines
3.5 KiB
Ruby

require 'flag_query'
class Admin::FlagsController < Admin::AdminController
def self.flags_per_page
10
end
def index
# we may get out of sync, fix it here
PostAction.update_flagged_posts_count
offset = params[:offset].to_i
per_page = Admin::FlagsController.flags_per_page
posts, topics, users, post_actions, total_rows = FlagQuery.flagged_posts_report(
current_user,
filter: params[:filter],
user_id: params[:user_id],
offset: offset,
topic_id: params[:topic_id],
per_page: per_page,
rest_api: params[:rest_api].present?
)
if params[:rest_api]
meta = {
types: {
disposed_by: 'user'
}
}
if (total_rows || 0) > (offset + per_page)
meta[:total_rows_flagged_posts] = total_rows
meta[:load_more_flagged_posts] = admin_flags_filtered_path(
filter: params[:filter],
offset: offset + per_page,
rest_api: params[:rest_api],
topic_id: params[:topic_id]
)
end
render_json_dump(
{
flagged_posts: posts,
topics: serialize_data(topics, FlaggedTopicSerializer),
users: serialize_data(users, FlaggedUserSerializer),
post_actions: post_actions
},
rest_serializer: true,
meta: meta
)
else
render_json_dump(
posts: posts,
topics: serialize_data(topics, FlaggedTopicSerializer),
users: serialize_data(users, FlaggedUserSerializer)
)
end
end
def agree
params.permit(:id, :action_on_post)
post = Post.find(params[:id])
DiscourseEvent.trigger(
:before_staff_flag_action,
type: 'agree',
post: post,
action_on_post: params[:action_on_post],
user: current_user
)
post_action_type = PostAction.post_action_type_for_post(post.id)
if !post_action_type
render_json_error(
I18n.t("flags.errors.already_handled"),
status: 409
)
return
end
keep_post = ['silenced', 'suspended', 'keep'].include?(params[:action_on_post])
delete_post = params[:action_on_post] == "delete"
restore_post = params[:action_on_post] == "restore"
if delete_post
# PostDestroy calls PostAction.agree_flags!
destroy_post(post)
elsif restore_post
PostAction.agree_flags!(post, current_user, delete_post)
PostDestroyer.new(current_user, post).recover
else
PostAction.agree_flags!(post, current_user, delete_post)
if !keep_post
PostAction.hide_post!(post, post_action_type)
end
end
render body: nil
end
def disagree
params.permit(:id)
post = Post.find(params[:id])
DiscourseEvent.trigger(
:before_staff_flag_action,
type: 'disagree',
post: post,
user: current_user
)
PostAction.clear_flags!(post, current_user)
render body: nil
end
def defer
params.permit(:id, :delete_post)
post = Post.find(params[:id])
DiscourseEvent.trigger(
:before_staff_flag_action,
type: 'defer',
post: post,
user: current_user
)
PostAction.defer_flags!(post, current_user, params[:delete_post])
destroy_post(post) if params[:delete_post]
render body: nil
end
private
def destroy_post(post)
if post.is_first_post?
topic = Topic.find_by(id: post.topic_id)
guardian.ensure_can_delete!(topic) if topic.present?
end
PostDestroyer.new(current_user, post).destroy
end
end