# frozen_string_literal: true require "creditsafe/errors" module Creditsafe module Messages class Message attr_reader :code, :message, :error def initialize(code: nil, message: nil, error: false) raise ArgumentError, "Parameters 'code' and 'message' are mandatory" \ unless code && message @code = code @message = message @error = error end alias_method :error?, :error def error_class return unless error? case code[1].to_i when 1 then Creditsafe::DataError when 2 then Creditsafe::AccountError when 3 then Creditsafe::RequestError when 4 then Creditsafe::ProcessingError else Creditsafe::UnknownApiError end end end # rubocop:disable Layout/LineLength NO_RESULTS = Message.new(code: "010101", message: "No results") TOO_MANY_RESULTS = Message.new(code: "010102", message: "Too many results") REPORT_UNAVAILABLE = Message.new(code: "010103", message: "Report unavailable", error: true) REPORT_UNAVAILABLE_LEGAL = Message.new(code: "010104", message: "Report unavailable due to legal causes", error: true) REPORT_UNAVAILABLE_ONLINE = Message.new(code: "010105", message: "Report unavailable online", error: true) LEGAL_NOTICE = Message.new(code: "010106", message: "Legal notice") INVALID_CREDENTIALS = Message.new(code: "020101", message: "Invalid credentials", error: true) ACCESS_RESTRICTED = Message.new(code: "020102", message: "Access restricted", error: true) ACCESS_LIMITS_NEARING = Message.new(code: "020103", message: "Access limits nearing") REPORTBOX_ALMOST_FULL = Message.new(code: "020201", message: "Reportbox almost full", error: true) REPORTBOX_FULL = Message.new(code: "020202", message: "Reportbox full", error: true) INVALID_REQUEST_XML = Message.new(code: "030101", message: "Invalid request XML", error: true) INVALID_OPERATION_PARAMS = Message.new(code: "030102", message: "Invalid operation parameters", error: true) OPERATION_NOT_SUPPORTED = Message.new(code: "030103", message: "Operation not supported", error: true) INVALID_CUSTOM_DATA_SPECIFIED = Message.new(code: "030104", message: "Invalid custom data specified", error: true) CHANGE_NOTIFICATION = Message.new(code: "030201", message: "Change notification") TEMPORARY_SYSTEM_PROBLEM = Message.new(code: "030202", message: "Temporary system problem", error: true) ENDPOINT_SHUTDOWN = Message.new(code: "030203", message: "Endpoint shutdown", error: true) UNEXPECTED_INTERNAL_ERROR = Message.new(code: "040101", message: "Unexpected internal error", error: true) OTHER_ERROR = Message.new(code: "040102", message: "Other", error: true) DATA_SERVICE_PROBLEMS = Message.new(code: "040103", message: "Data service access problems", error: true) DATA_SERVICE_INVALID_RESPONSE = Message.new(code: "040104", message: "Data service invalid response", error: true) # rubocop:enable Layout/LineLength ALL = [ NO_RESULTS, TOO_MANY_RESULTS, REPORT_UNAVAILABLE, REPORT_UNAVAILABLE_LEGAL, REPORT_UNAVAILABLE_ONLINE, LEGAL_NOTICE, INVALID_CREDENTIALS, ACCESS_RESTRICTED, ACCESS_LIMITS_NEARING, REPORTBOX_ALMOST_FULL, REPORTBOX_FULL, INVALID_REQUEST_XML, INVALID_OPERATION_PARAMS, OPERATION_NOT_SUPPORTED, INVALID_CUSTOM_DATA_SPECIFIED, CHANGE_NOTIFICATION, TEMPORARY_SYSTEM_PROBLEM, ENDPOINT_SHUTDOWN, UNEXPECTED_INTERNAL_ERROR, OTHER_ERROR, DATA_SERVICE_PROBLEMS, DATA_SERVICE_INVALID_RESPONSE, ].freeze # Creditsafe documentation shows a 6 digit error code, however their API # strips the leading 0. To comply with the docs, we pad the API code here to # ensure we find the right match def self.for_code(code) padded_code = code.rjust(6, "0") message = ALL.find { |msg| msg.code == padded_code } if message.nil? message = Message.new(code: code, message: "Unknown error", error: true) end message end end end