Sha256: 9fe0ff1690d20c6a336dbc5950de81553d8febe6119751bbadf2526f40099f2b

Contents?: true

Size: 1.81 KB

Versions: 6

Compression:

Stored size: 1.81 KB

Contents

# frozen_string_literal: true

require 'uri'

module Billomat
  ##
  # This class provides the possibility to query the resources
  class Search
    ##
    # Creates a new search object
    #
    # @param [Class] resource The resource class to be queried
    # @param [Hash] hash The query
    def initialize(resource, hash)
      @resource = resource
      @hash     = hash
    end

    # @return [String] The path including the query
    def path
      "#{@resource.base_path}?#{hash_to_query}"
    end

    ##
    # Runs the query and calls the gateway
    # Currently it will always return an empty array when no query is provided
    #
    # @return [Array<Billomat::Model::Base>]
    def run
      return [] if @hash.reject { |k, v| v.nil? }.empty?
      to_array(Billomat::Gateway.new(:get, path).run)
    end

    ##
    # Corrects the response to always return an array
    #
    # @todo Due to a strange API behaviour we have to fix the reponse here.
    #   This may be fixed in a new API version.
    #
    # @param [Hash] resp The response from the gateway
    # @return [Array<Billomat::Model::Base>]
    def to_array(resp)
      case count(resp)
      when 0
        []
      when 1
        # Necessary due to strange API behaviour
        [@resource.new(resp["#{name}s"][name])]
      else
        resp["#{name}s"][name].map do |c|
          @resource.new(c)
        end
      end
    end

    # @return [String] The name of the resource
    def name
      @resource.resource_name
    end

    # @param [Hash] resp The response from the gateway
    # @return [Integer] The number of records found
    def count(resp)
      return 0 if resp.nil?
      resp["#{name}s"]['@total'].to_i
    end

    private

    # @return [String] The query as www encoded string
    def hash_to_query
      URI.encode_www_form(@hash)
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
billomat-0.2.0 lib/billomat/search.rb
billomat-0.1.6 lib/billomat/search.rb
billomat-0.1.5 lib/billomat/search.rb
billomat-0.1.4 lib/billomat/search.rb
billomat-0.1.3 lib/billomat/search.rb
billomat-0.1.2 lib/billomat/search.rb