Sha256: f75d638ddebae2c9d4af01966be84d5ddb04d51711caea05c18100eff767a705

Contents?: true

Size: 1.52 KB

Versions: 1

Compression:

Stored size: 1.52 KB

Contents

# frozen_string_literal: true

require_relative '../error'

module Easyship
  module Middleware
    # Response middleware that raises an error based on the response status code
    class ErrorHandlerMiddleware < Faraday::Middleware
      def on_complete(env)
        status_code = env[:status].to_i
        body = response_body(env[:body])

        handle_status_code(status_code, body)
      end

      private

      def handle_status_code(status_code, body)
        error_class = Easyship::Error::ERRORS[status_code]

        raise_error(error_class, body) if error_class
      end

      def raise_error(class_error, body)
        raise class_error.new(message: message(body), body_error: body_error(body))
      end

      def body_error(body)
        return {} unless body.is_a?(Hash)

        if body.key?(:error) && body[:error].is_a?(Hash)
          format_body_error(body)
        elsif body.key?(:errors)
          format_body_errors(body)
        else
          format_by_default(body)
        end
      end

      def message(body)
        body_error(body)[:message]
      end

      def format_body_error(body)
        body[:error]
      end

      def format_body_errors(body)
        errors = Array(body[:errors])

        { details: errors, message: errors.join(', ') }
      end

      def format_by_default(body)
        { details: body, message: 'Something went wrong.' }
      end

      def response_body(body)
        JSON.parse(body, symbolize_names: true)
      rescue JSON::ParserError
        nil
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
easyship-0.1.4 lib/easyship/middleware/error_handler_middleware.rb