Sha256: d75f4ebf0f09f4fa4918d01a83a94a6c300833eb29ab37bae2247e3a7d7e6547

Contents?: true

Size: 1.37 KB

Versions: 8

Compression:

Stored size: 1.37 KB

Contents

# frozen_string_literal: true

module Imis
  module Error
    class Api < StandardError
      attr_reader :response
      attr_accessor :metadata

      def self.from(response)
        new('The iMIS API returned an error.', response)
      end

      def initialize(message, response, metadata = {})
        super(message)
        @metadata = metadata
        @response = response
      end

      def bugsnag_meta_data
        { api: { status: status, body: body }.merge!(metadata) }
      end

    private

      def status
        @status ||=
          case response.code
          when '400'
            :bad_request
          when '401'
            :unauthorized # RequestVerificationToken invalid
          when '404'
            :not_found
          when '422'
            :unprocessable_entity # validation error
          when /^50\d$/
            :internal_server_error # error within iMIS
          end
      end

      def response_body
        @response_body ||= JSON.parse(response.body)
      rescue StandardError
        @response_body ||= response.body
      end

      def body
        return response_body unless response_body.is_a?(Hash)

        case response_body['error']
        when 'invalid_grant'
          response_body['error_description']
        else
          # Unknown error type: just use the raw response
          response.body
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
usps-imis-api-0.2.1 lib/imis/error/api.rb
usps-imis-api-0.2.0 lib/imis/error/api.rb
usps-imis-api-0.1.3 lib/imis/error/api.rb
usps-imis-api-0.1.2 lib/imis/error/api.rb
usps-imis-api-0.1.1 lib/imis/error/api.rb
usps-imis-api-0.1.1.pre.2 lib/imis/error/api.rb
usps-imis-api-0.1.1.pre.1 lib/imis/error/api.rb
usps-imis-api-0.1.0 lib/imis/error/api.rb