Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
module ActionSprout::Facebook
  class ErrorHandler

    def self.call(response, access_token, **options)
      self.new(response, access_token, **options).examine
    end

    attr_reader :response, :access_token,
     :app_rate_limited, :page_rate_limited,
     :page_migrated, :not_found, :authentication_error

    def initialize(
        response, access_token,
        app_rate_limited: default_delegate,
        page_rate_limited: default_delegate,
        page_migrated: default_delegate,
        not_found: default_delegate,
        authentication_error: default_delegate
      )

      @response = BadResponse.from_response response
      @access_token = access_token
      @app_rate_limited = app_rate_limited
      @page_rate_limited = page_rate_limited
      @page_migrated = page_migrated
      @not_found = not_found
      @authentication_error = authentication_error
    end

    def examine
      check_app_rate_limit
      check_page_rate_limit
      raise_error_if_needed
    end

    private

    def check_app_rate_limit
      if response.app_rate_limited?
        app_rate_limited.call error: nil, response: response
      end
    end

    def check_page_rate_limit
      if response.page_rate_limited?
        page_rate_limited.call error: nil, response: response
      end
    end

    def raise_error_if_needed
      return unless response.has_error?

      if response.authentication_error?
        error = AuthenticationError.new response.message, response
        authentication_error.call error: error, response: response
        raise error
      elsif response.page_migrated?
        error = PageMigratedError.new response.message, response, **migrated_ids
        page_migrated.call error: error, response: response, **migrated_ids
        raise error
      elsif response.not_found?
        error = NotFoundError.new response.message, response, **not_found_id
        not_found.call error: error, response: response, **not_found_id
        raise error
      elsif response.transient? || response.unknown?
        raise RetriableError.new response.message, response
      else
        raise FacebookError.new response.message, response
      end
    end

    def migrated_ids
      @_migrated_ids ||= parse_migrated_ids
    end

    def parse_migrated_ids
      matches = response.message.match(/Page ID (\d+) was migrated to page ID (\d+)\./)
      old_id, new_id = *matches.to_a.drop(1)
      { old_id: old_id, new_id: new_id }
    end

    def not_found_id
      @_not_found_id ||= parse_not_found_id
    end

    def parse_not_found_id
      matches = response.message.match(/Object with ID '([^']+)'/)
      id = matches[1] if matches

      { id: id }
    end

    def default_delegate
      lambda { |error:, response:, **options| }
    end
  end
end