docbrown/app/controllers/response_templates_controller.rb
Anna Buianova 784afdf41e
Routine rubocop fixes (#19254)
* Rubocop fixes

* Rubocop fixes

* Fixed rubocop violation

* Fixed policies rubocop violations

* More rubocop fixes
2023-03-24 14:37:44 +03:00

120 lines
4.1 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
unless tries_to_create_a_mod_response_template? && can_create_mod_response_templates?
response_template.user_id = current_user.id
response_template.type_of = "personal_comment"
end
response_template.content_type = "body_markdown"
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 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
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
private
def authorized_user
@authorized_user ||= Authorizer.for(user: current_user)
end
def can_create_mod_response_templates?
authorized_user.accesses_mod_response_templates?
end
def tries_to_create_a_mod_response_template?
params[:response_template][:type_of] == "mod_comment"
end
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