module FmRest
module V1
class RaiseErrors < Faraday::Middleware
ERROR_RANGES = {
-1 => APIError::UnknownError,
100 => APIError::ResourceMissingError,
101 => APIError::RecordMissingError,
102..199 => APIError::ResourceMissingError,
200..299 => APIError::AccountError,
300..399 => APIError::LockError,
400 => APIError::ParameterError,
401 => APIError::NoMatchingRecordsError,
402..499 => APIError::ParameterError,
500..599 => APIError::ValidationError,
800..899 => APIError::SystemError,
952 => APIError::InvalidToken,
953 => APIError::MaximumDataAPICallsExceeded,
1200..1299 => APIError::ScriptError,
1400..1499 => APIError::ODBCError
}.freeze
def on_complete(env)
if !(/\bjson$/ === env.["content-type"]) && env.status == 401
raise FmRest::APIError::AccountError.new(212, "Authentication failed (HTTP 401: Unauthorized)")
end
return unless env.body.is_a?(Hash)
if env.body[:metadata] && env.body[:metadata][:messages]
check_errors(env.body[:metadata][:messages])
elsif env.body["messages"]
check_errors(env.body["messages"])
end
end
private
def check_errors(messages)
messages.each do |message|
error_code = (message["code"] || message[:code]).to_i
next if error_code.zero?
error_message = message["message"] || message[:message]
*, exception_class = ERROR_RANGES.find { |k, v| k === error_code }
raise (exception_class || APIError).new(error_code, error_message)
end
end
end
end
end