2013-02-05 14:16:51 -05:00
|
|
|
require_dependency 'discourse'
|
|
|
|
|
|
|
|
class PostActionsController < ApplicationController
|
2018-01-31 23:17:59 -05:00
|
|
|
requires_login
|
|
|
|
|
2017-08-31 00:06:56 -04:00
|
|
|
before_action :fetch_post_from_params
|
|
|
|
before_action :fetch_post_action_type_id_from_params
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
|
|
def create
|
2017-01-05 21:39:44 -05:00
|
|
|
raise Discourse::NotFound if @post.blank?
|
|
|
|
|
2014-09-03 14:43:07 -04:00
|
|
|
taken = PostAction.counts_for([@post], current_user)[@post.id]
|
2016-12-20 23:01:26 -05:00
|
|
|
|
|
|
|
guardian.ensure_post_can_act!(
|
|
|
|
@post,
|
|
|
|
PostActionType.types[@post_action_type_id],
|
2017-09-08 01:07:22 -04:00
|
|
|
opts: {
|
|
|
|
is_warning: params[:is_warning],
|
|
|
|
taken_actions: taken
|
|
|
|
}
|
2016-12-20 23:01:26 -05:00
|
|
|
)
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2013-05-31 17:38:28 -04:00
|
|
|
args = {}
|
|
|
|
args[:message] = params[:message] if params[:message].present?
|
2016-04-03 11:33:56 -04:00
|
|
|
args[:is_warning] = params[:is_warning] if params[:is_warning].present? && guardian.is_staff?
|
2014-07-28 13:17:37 -04:00
|
|
|
args[:take_action] = true if guardian.is_staff? && params[:take_action] == 'true'
|
2014-02-13 15:10:02 -05:00
|
|
|
args[:flag_topic] = true if params[:flag_topic] == 'true'
|
2013-05-31 17:38:28 -04:00
|
|
|
|
2018-06-20 09:19:37 -04:00
|
|
|
begin
|
|
|
|
post_action = PostAction.act(current_user, @post, @post_action_type_id, args)
|
|
|
|
rescue PostAction::FailedToCreatePost => e
|
|
|
|
return render_json_error(e.message)
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2013-05-03 20:52:45 -04:00
|
|
|
if post_action.blank? || post_action.errors.present?
|
|
|
|
render_json_error(post_action)
|
2013-02-07 10:45:24 -05:00
|
|
|
else
|
2013-05-03 20:52:45 -04:00
|
|
|
# We need to reload or otherwise we are showing the old values on the front end
|
|
|
|
@post.reload
|
2016-03-18 11:17:51 -04:00
|
|
|
|
|
|
|
if @post_action_type_id == PostActionType.types[:like]
|
|
|
|
limiter = post_action.post_action_rate_limiter
|
|
|
|
response.headers['Discourse-Actions-Remaining'] = limiter.remaining.to_s
|
|
|
|
response.headers['Discourse-Actions-Max'] = limiter.max.to_s
|
|
|
|
end
|
2014-09-24 22:02:41 -04:00
|
|
|
render_post_json(@post, _add_raw = false)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def destroy
|
2014-05-06 09:41:59 -04:00
|
|
|
post_action = current_user.post_actions.find_by(post_id: params[:id].to_i, post_action_type_id: @post_action_type_id, deleted_at: nil)
|
2013-02-05 14:16:51 -05:00
|
|
|
raise Discourse::NotFound if post_action.blank?
|
2013-05-03 20:52:45 -04:00
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
guardian.ensure_can_delete!(post_action)
|
2013-05-03 20:52:45 -04:00
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
PostAction.remove_act(current_user, @post, post_action.post_action_type_id)
|
|
|
|
|
2014-09-02 17:37:19 -04:00
|
|
|
@post.reload
|
2014-09-24 22:02:41 -04:00
|
|
|
render_post_json(@post, _add_raw = false)
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
|
2014-07-28 13:17:37 -04:00
|
|
|
def defer_flags
|
|
|
|
guardian.ensure_can_defer_flags!(@post)
|
2013-02-06 23:15:48 -05:00
|
|
|
|
2014-07-28 13:17:37 -04:00
|
|
|
PostAction.defer_flags!(@post, current_user)
|
2013-02-06 23:15:48 -05:00
|
|
|
|
2014-08-11 04:48:00 -04:00
|
|
|
render json: { success: true }
|
2013-02-06 23:15:48 -05:00
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
private
|
|
|
|
|
2018-06-07 01:28:18 -04:00
|
|
|
def fetch_post_from_params
|
|
|
|
params.require(:id)
|
|
|
|
|
|
|
|
flag_topic = params[:flag_topic]
|
|
|
|
flag_topic = flag_topic && (flag_topic == true || flag_topic == "true")
|
|
|
|
|
|
|
|
post_id = if flag_topic
|
|
|
|
begin
|
|
|
|
Topic.find(params[:id]).posts.first.id
|
|
|
|
rescue
|
|
|
|
raise Discourse::NotFound
|
2014-02-05 17:54:16 -05:00
|
|
|
end
|
2018-06-07 01:28:18 -04:00
|
|
|
else
|
|
|
|
params[:id]
|
|
|
|
end
|
2014-02-05 17:54:16 -05:00
|
|
|
|
2018-06-07 01:28:18 -04:00
|
|
|
finder = Post.where(id: post_id)
|
2013-02-08 19:04:14 -05:00
|
|
|
|
2018-06-07 01:28:18 -04:00
|
|
|
# Include deleted posts if the user is a staff
|
|
|
|
finder = finder.with_deleted if guardian.is_staff?
|
2013-02-08 19:04:14 -05:00
|
|
|
|
2018-06-07 01:28:18 -04:00
|
|
|
@post = finder.first
|
|
|
|
end
|
2013-05-03 20:52:45 -04:00
|
|
|
|
2018-06-07 01:28:18 -04:00
|
|
|
def fetch_post_action_type_id_from_params
|
|
|
|
params.require(:post_action_type_id)
|
|
|
|
@post_action_type_id = params[:post_action_type_id].to_i
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|