docbrown/app/controllers/response_templates_controller.rb
Joshua Wehner 07e1364f54
Trusted users can view & use moderator response templates (#17867)
* Trusted users can use moderator response templates

* Iron out container reveal logic

* Explanatory comment on controller endpoint confusion
2022-06-16 14:05:49 +02:00

105 lines
3.7 KiB
Ruby

class ResponseTemplatesController < ApplicationController
after_action :verify_authorized
before_action :authenticate_user!, :ensure_json_request, only: %i[index]
rescue_from ArgumentError, with: :error_unprocessable_entity
MOD_TYPES = %w[mod_comment tag_adjustment].freeze
ADMIN_TYPES = %w[email_reply abuse_report_email_reply].freeze
# This endpoint is called to provide a mix of personal & mod_comment templates
# when replying to a comment, it also might be called for Email and Abuse
# Report Email templates. To be compatible with both uses, it returns a Hash
# sometimes and an array at other times. When type_of is present, this returns
# an array of templates. When the type_of param is missing, this returns a
# hash, keys are type_ofs, values are an array of templates.
def index
@response_templates = policy_scope(ResponseTemplate).group_by(&:type_of)
@response_templates = @response_templates.fetch(params[:type_of], []) if params[:type_of].present?
if MOD_TYPES.include?(params[:type_of])
authorize :response_template, :moderator_index?
elsif ADMIN_TYPES.include?(params[:type_of])
authorize :response_template, :admin_index?
else
authorize :response_template, :index?
end
respond_to do |format|
format.json { render :index }
end
end
def create
authorize ResponseTemplate
response_template.user_id = current_user.id
response_template.content_type = "body_markdown"
response_template.type_of = "personal_comment"
if response_template.save
flash[:settings_notice] =
I18n.t("response_templates_controller.created", title: response_template.title)
redirect_to user_settings_path(tab: "response-templates", id: response_template.id)
else
flash[:error] =
I18n.t("response_templates_controller.response_template_error", errors: response_template.errors_as_sentence)
attributes = permitted_attributes(ResponseTemplate)
redirect_to user_settings_path(
tab: "response-templates",
id: response_template.id,
previous_title: attributes[:title],
previous_content: attributes[:content],
)
end
end
def destroy
authorize response_template
if response_template.destroy
flash[:settings_notice] =
I18n.t("response_templates_controller.deleted", title: response_template.title)
else
flash[:error] = response_template.errors_as_sentence # this will probably never fail
end
redirect_to user_settings_path(tab: "response-templates")
end
def update
authorize response_template
attributes = permitted_attributes(ResponseTemplate)
if response_template.update(attributes)
flash[:settings_notice] =
I18n.t("response_templates_controller.updated", title: response_template.title)
redirect_to user_settings_path(tab: "response-templates", id: response_template.id)
else
flash[:error] =
I18n.t("response_templates_controller.response_template_error", errors: response_template.errors_as_sentence)
redirect_to user_settings_path(
tab: "response-templates",
id: response_template.id,
previous_title: attributes[:title],
previous_content: attributes[:content],
)
end
end
private
def response_template
@response_template ||= if params[:id].present?
ResponseTemplate.find(params[:id])
else
ResponseTemplate.new(permitted_attributes(ResponseTemplate))
end
end
def ensure_json_request
routing_error unless request.format == :json
end
def error_unprocessable_entity(message)
render json: { error: message, status: 422 }, status: :unprocessable_entity
end
end