Class: SafetyGoggles::Handler

Inherits:
Object
  • Object
show all
Defined in:
lib/safety_goggles/handler.rb

Constant Summary collapse

ERROR_CODES =
{
  "ActionController::ParameterMissing" => 422,
  "ActionController::UnpermittedParameters" => 422,
  "ActiveModel::ValidationError" => 422,
  "ActiveRecord::RecordInvalid" => 422,
  "ActiveRecord::RecordNotFound" => 404,
  "ActiveRecord::RecordNotUnique" => 422,
  "ArgumentError" => 422,
  "Net::LDAP::Error" => 422,
  "SafetyGoggles::RecordNotFoundError" => 404,
  "SafetyGoggles::UnauthorizedError" => 401,
  "SecurityError" => 403
}.freeze
SEVERITIES =
{
  500 => "fatal",
  401 => "error",
  403 => "error"
}.freeze

Class Method Summary collapse

Class Method Details

.get_backtrace(error) ⇒ Object



59
60
61
62
63
64
# File 'lib/safety_goggles/handler.rb', line 59

def self.get_backtrace(error)
  return [] unless error.respond_to?(:backtrace)
  return [] if error.backtrace.nil?

  error.backtrace.reject { |line| %r{/gems/}.match(line).present? }
end

.guess_envObject



72
73
74
75
76
# File 'lib/safety_goggles/handler.rb', line 72

def self.guess_env
  return Rails.env if defined?(Rails) && Rails.respond_to?(:env)

  "development"
end

.handle_error(error, env = Handler.guess_env) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/safety_goggles/handler.rb', line 25

def self.handle_error(error, env = Handler.guess_env)
  logger.debug("::handle_error called with #{error}, #{env}")
  code = ERROR_CODES.fetch(error.class.to_s, 500) if code.nil?

  logger.error("ERROR: #{code} \n#{error.class} \n#{error}")
  logger.error(get_backtrace(error).join("\n"))

  handle_serious_error(error, code, env) if serious_env?

  code
end

.handle_serious_error(error, code, env) ⇒ Object

:nocov:



38
39
40
41
42
43
44
45
46
# File 'lib/safety_goggles/handler.rb', line 38

def self.handle_serious_error(error, code, env)
  logger.debug("::handle_serious_error called with #{error}, #{code}, #{env}")
  severity = SEVERITIES.fetch(code, "warning")

  Raven.capture_exception(error,
                          extra: { nice_backtrace: get_backtrace(error) },
                          level: severity,
                          tags:  { code: code, class: error.class })
end

.loggerObject



66
67
68
69
70
# File 'lib/safety_goggles/handler.rb', line 66

def self.logger
  return Rails.logger if defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger.present?

  Logger.new(STDOUT)
end

.serious_env?Boolean

:nocov:

Returns:

  • (Boolean)


49
50
51
52
53
54
55
56
57
# File 'lib/safety_goggles/handler.rb', line 49

def self.serious_env?
  return false unless defined?(Rails)

  # :nocov:
  # rubocop:disable Rails/UnknownEnv
  Rails.env.production? || Rails.env.staging?
  # rubocop:enable Rails/UnknownEnv
  # :nocov:
end