discourse/app/controllers/admin/flags_controller.rb

147 lines
3.8 KiB
Ruby

# frozen_string_literal: true
require 'flag_query'
class Admin::FlagsController < Admin::AdminController
def self.flags_per_page
10
end
def index
Discourse.deprecate("FlagsController#index has been deprecated, please use the Reviewable API instead", since: "2.3.0beta5", drop_from: "2.4")
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
)
meta = {
types: {
disposed_by: 'user'
}
}
next_segment = offset + per_page
if (total_rows || 0) > next_segment
meta[:total_rows_flagged_posts] = total_rows
meta[:load_more_flagged_posts] = admin_flags_filtered_path(
filter: params[:filter],
offset: next_segment,
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
)
end
def agree
Discourse.deprecate("FlagsController#agree has been deprecated, please use the Reviewable API instead", since: "2.3.0beta5", drop_from: "2.4")
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
)
reviewable = post.reviewable_flag
return render_json_error(I18n.t("flags.errors.already_handled"), status: 409) if reviewable.blank?
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 automatically agrees with flags
destroy_post(post)
elsif restore_post
reviewable.perform(current_user, :agree_and_restore)
else
reviewable.perform(
current_user,
:agree_and_keep,
post_was_deleted: delete_post,
hide_post: !keep_post
)
end
render body: nil
end
def disagree
Discourse.deprecate("FlagsController#disagree has been deprecated, please use the Reviewable API instead", since: "2.3.0beta5", drop_from: "2.4")
params.permit(:id)
post = Post.find(params[:id])
if reviewable = post.reviewable_flag
DiscourseEvent.trigger(
:before_staff_flag_action,
type: 'disagree',
post: post,
user: current_user
)
if post.hidden?
reviewable.perform(current_user, :disagree_and_restore)
else
reviewable.perform(current_user, :disagree)
end
end
render body: nil
end
def defer
Discourse.deprecate("FlagsController#defer has been deprecated, please use the Reviewable API instead", since: "2.3.0beta5", drop_from: "2.4")
params.permit(:id, :delete_post)
post = Post.find(params[:id])
if reviewable = post.reviewable_flag
DiscourseEvent.trigger(
:before_staff_flag_action,
type: 'defer',
post: post,
user: current_user
)
reviewable.perform(current_user, :ignore, post_was_deleted: params[:delete_post])
destroy_post(post) if params[:delete_post]
end
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