From cbe78e505b4b9ac2542e8752e45d025b27d92289 Mon Sep 17 00:00:00 2001 From: Sergei Tsoganov Date: Thu, 13 Jul 2023 12:32:33 +0300 Subject: [PATCH] Fixed codeclimate issues --- app/controllers/concerns/epp_requestable.rb | 4 +- .../concerns/error_and_log_handler.rb | 80 +++++++++++++++++++ app/controllers/repp/v1/base_controller.rb | 74 +---------------- 3 files changed, 84 insertions(+), 74 deletions(-) create mode 100644 app/controllers/concerns/error_and_log_handler.rb diff --git a/app/controllers/concerns/epp_requestable.rb b/app/controllers/concerns/epp_requestable.rb index 59d064644..05f39d93f 100644 --- a/app/controllers/concerns/epp_requestable.rb +++ b/app/controllers/concerns/epp_requestable.rb @@ -9,8 +9,8 @@ module EppRequestable authorize! :create, Epp::Server result = server.request(request_params[:payload]) render_success(data: { xml: result.force_encoding('UTF-8') }) - rescue StandardError - handle_non_epp_errors(nil, I18n.t('errors.messages.epp_conn_error')) + rescue StandardError => e + handle_non_epp_errors(nil, e.message.presence || I18n.t('errors.messages.epp_conn_error')) end private diff --git a/app/controllers/concerns/error_and_log_handler.rb b/app/controllers/concerns/error_and_log_handler.rb new file mode 100644 index 000000000..57f8c6b08 --- /dev/null +++ b/app/controllers/concerns/error_and_log_handler.rb @@ -0,0 +1,80 @@ +module ErrorAndLogHandler + extend ActiveSupport::Concern + + included do + around_action :log_request + end + + private + + # rubocop:disable Metrics/MethodLength + def log_request + yield + rescue ActiveRecord::RecordNotFound + handle_record_not_found + rescue ActionController::ParameterMissing, Apipie::ParamMissing => e + handle_parameter_missing(e) + rescue Apipie::ParamInvalid => e + handle_param_invalid(e) + rescue CanCan::AccessDenied => e + handle_access_denied(e) + rescue Shunter::ThrottleError => e + handle_throttle_error(e) + ensure + create_repp_log + end + # rubocop:enable Metrics/MethodLength + + def handle_record_not_found + @response = { code: 2303, message: 'Object does not exist' } + render(json: @response, status: :not_found) + end + + def handle_parameter_missing(error) + @response = { code: 2003, message: error.message.gsub(/\n/, '. ') } + render(json: @response, status: :bad_request) + end + + def handle_param_invalid(error) + @response = { code: 2005, message: error.message.gsub(/\n/, '. ') } + render(json: @response, status: :bad_request) + end + + def handle_access_denied(error) + @response = { code: 2201, message: 'Authorization error' } + logger.error error.to_s + render(json: @response, status: :unauthorized) + end + + def handle_throttle_error(error) + @response = { code: 2502, message: Shunter.default_error_message } + logger.error error.to_s unless Rails.env.test? + render(json: @response, status: :bad_request) + end + + def create_repp_log + log_attributes = build_log_attributes + ApiLog::ReppLog.create(log_attributes) + end + + def build_log_attributes + { + request_path: request.path, ip: request.ip, + request_method: request.request_method, + request_params: build_request_params_json, + uuid: request.try(:uuid), + response: @response.to_json, + response_code: response.status, + api_user_name: current_user.try(:username), + api_user_registrar: current_user.try(:registrar).try(:to_s) + } + end + + def build_request_params_json + request.params.except('route_info').to_json + end + + def logger + Rails.logger + end +end diff --git a/app/controllers/repp/v1/base_controller.rb b/app/controllers/repp/v1/base_controller.rb index 3da75c672..fd360d4d3 100644 --- a/app/controllers/repp/v1/base_controller.rb +++ b/app/controllers/repp/v1/base_controller.rb @@ -3,7 +3,8 @@ module Repp class BaseController < ActionController::API # rubocop:disable Metrics/ClassLength attr_reader :current_user - around_action :log_request + include ErrorAndLogHandler + before_action :authenticate_user before_action :set_locale before_action :validate_webclient_ca @@ -13,73 +14,6 @@ module Repp private - # rubocop:disable Metrics/MethodLength - def log_request - yield - rescue ActiveRecord::RecordNotFound - handle_record_not_found - rescue ActionController::ParameterMissing, Apipie::ParamMissing => e - handle_parameter_missing(e) - rescue Apipie::ParamInvalid => e - handle_param_invalid(e) - rescue CanCan::AccessDenied => e - handle_access_denied(e) - rescue Shunter::ThrottleError => e - handle_throttle_error(e) - ensure - create_repp_log - end - # rubocop:enable Metrics/MethodLength - - def handle_record_not_found - @response = { code: 2303, message: 'Object does not exist' } - render(json: @response, status: :not_found) - end - - def handle_parameter_missing(e) - @response = { code: 2003, message: e.message.gsub(/\n/, '. ') } - render(json: @response, status: :bad_request) - end - - def handle_param_invalid(e) - @response = { code: 2005, message: e.message.gsub(/\n/, '. ') } - render(json: @response, status: :bad_request) - end - - def handle_access_denied(e) - @response = { code: 2201, message: 'Authorization error' } - logger.error e.to_s - render(json: @response, status: :unauthorized) - end - - def handle_throttle_error(e) - @response = { code: 2502, message: Shunter.default_error_message } - logger.error e.to_s unless Rails.env.test? - render(json: @response, status: :bad_request) - end - - def create_repp_log - log_attributes = build_log_attributes - ApiLog::ReppLog.create(log_attributes) - end - - def build_log_attributes - { - request_path: request.path, ip: request.ip, - request_method: request.request_method, - request_params: build_request_params_json, - uuid: request.try(:uuid), - response: @response.to_json, - response_code: response.status, - api_user_name: current_user.try(:username), - api_user_registrar: current_user.try(:registrar).try(:to_s) - } - end - - def build_request_params_json - request.params.except('route_info').to_json - end - def set_domain registrar = current_user.registrar @domain = Epp::Domain.find_by(registrar: registrar, name: params[:domain_id]) @@ -234,10 +168,6 @@ module Repp request.headers['Requester'] == 'tara' end - def logger - Rails.logger - end - def auth_values_to_data(registrar:) data = current_user.as_json(only: %i[id username roles]) data[:registrar_name] = registrar.name