class GoCardlessPro::Middlewares::RaiseGoCardlessErrors

Constants

API_ERROR_STATUSES
CLIENT_ERROR_STATUSES

Public Instance Methods

on_complete(env) click to toggle source
# File lib/gocardless_pro/middlewares/raise_gocardless_errors.rb, line 7
def on_complete(env)
  if !json?(env) || API_ERROR_STATUSES.include?(env.status)
    raise ApiError, generate_error_data(env)
  end

  if CLIENT_ERROR_STATUSES.include?(env.status)
    json_body ||= JSON.parse(env.body) unless env.body.empty?
    error_type = json_body['error']['type']

    error_class = error_class_for_status(env.status) || error_class_for_type(error_type)

    raise(error_class, json_body['error'])
  end
end

Private Instance Methods

error_class_for_status(code) click to toggle source
# File lib/gocardless_pro/middlewares/raise_gocardless_errors.rb, line 24
def error_class_for_status(code)
  {
    401 => GoCardlessPro::AuthenticationError,
    403 => GoCardlessPro::PermissionError,
    429 => GoCardlessPro::RateLimitError,
  }.fetch(code, nil)
end
error_class_for_type(type) click to toggle source
# File lib/gocardless_pro/middlewares/raise_gocardless_errors.rb, line 32
def error_class_for_type(type)
  {
    validation_failed: GoCardlessPro::ValidationError,
    gocardless: GoCardlessPro::GoCardlessError,
    invalid_api_usage: GoCardlessPro::InvalidApiUsageError,
    invalid_state: GoCardlessPro::InvalidStateError,
  }.fetch(type.to_sym)
end
generate_error_data(env) click to toggle source
# File lib/gocardless_pro/middlewares/raise_gocardless_errors.rb, line 41
def generate_error_data(env)
  {
    'message' => "Something went wrong with this request\n" \
                 "code: #{env.status}\n" \
                 "headers: #{env.response_headers}\n" \
                 "body: #{env.body}",
    'code' => env.status,
  }
end
json?(env) click to toggle source
# File lib/gocardless_pro/middlewares/raise_gocardless_errors.rb, line 51
def json?(env)
  content_type = env.response_headers['Content-Type'] ||
                 env.response_headers['content-type'] || ''

  content_type.include?('application/json')
end