mirror of
https://github.com/discourse/discourse.git
synced 2024-11-30 14:33:43 +08:00
bc3efab816
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.
148 lines
3.5 KiB
Ruby
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
|