Sha256: bd826e37de918b8337551645500592b5de329c7031a4e6b526910b9724b88eef

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

# frozen_string_literal: true

module Alma

  class BibItemSet < ResultSet

    class ResponseError < ::Alma::StandardError
    end

    attr_accessor :items
    attr_reader :raw_response, :total_record_count

    def_delegators :items, :[], :[]=, :empty?, :size, :each
    def_delegators :raw_response, :response, :request

    def initialize(response, options={})
      @raw_response = response
      parsed = response.parsed_response
      @total_record_count = parsed["total_record_count"]
      @options = options
      @mms_id = @options.delete(:mms_id)

      validate(response)
      @items = parsed.fetch(key, []).map { |item| single_record_class.new(item) }
    end

    def loggable
      { total_record_count: @total_record_count,
        mms_id: @mms_id,
        uri: @raw_response&.request&.uri.to_s
      }.select { |k, v| !(v.nil? || v.empty?) }
    end

    def validate(response)
      if response.code != 200
        log = loggable.merge(response.parsed_response)
        raise ResponseError.new("Could not get bib items.", log)
      end
    end

    def grouped_by_library
      group_by(&:library)
    end

    def filter_missing_and_lost
      clone = dup
      clone.items = reject(&:missing_or_lost?)
      clone
    end

    def all
      Enumerator.new do |yielder|
        offset = 0
        loop do
          r = (offset == 0) ? self : single_record_class.find(@mms_id, options=@options.merge({limit: 100, offset: offset}))
          unless r.empty?
            r.map { |item| yielder << item }
            offset += 100
          else
            raise StopIteration
          end
        end
      end
    end

    def each(&block)
       @items.each(&block)
    end

    def success?
      raw_response.response.code.to_s == "200"
    end

    def key
      "item"
    end

    def single_record_class
      Alma::BibItem
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
alma-0.3.1 lib/alma/bib_item_set.rb