* Allow trusted user to access response templates * Add request specs for trusted user templates * WIP: was just investigating... * Move permission check to authorizer * Revert "WIP: was just investigating..." This reverts commit c38c60f7ab19ce43c174729c2542a9041e9322e2. * Improved accessibility Co-authored-by: Suzanne Aitchison <suzanne@forem.com> Co-authored-by: Suzanne Aitchison <suzanne@forem.com>
120 lines
4.1 KiB
Ruby
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 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 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
|