class Skala::AlephAdapter::CreateUserHoldRequest

Public Instance Methods

call(username, document_number, options = {}) click to toggle source
# File lib/skala/aleph_adapter/create_user_hold_request.rb, line 9
def call(username, document_number, options = {})
  get_record_items_result = adapter.get_record_items(
    document_number, {
      username: username,
    }
  )

  if first_holdable_item = get_record_items_result.items.find(&:hold_request_can_be_created)
    document_base = options[:document_base] || adapter.default_document_base
    record_id = "#{document_base}#{document_number}"
    resolved_user_id = resolve_user(username)

    raw_aleph_response = adapter.restful_api.patron(resolved_user_id).record(record_id).holds.get(view: :full)
    doc = Nokogiri::XML(raw_aleph_response)

    if element = doc.at_xpath("//group/item-status[text() = '#{first_holdable_item.item_status}']/parent::*")
      group_id = element.attr("href").split("/").last
      pickup_location = element.xpath("./pickup-locations/pickup-location").first.try(:attr, "code")
      start_interest_date = Date.today.strftime("%Y%m%d")
      last_interest_date = (Date.today + 1.year).strftime("%Y%m%d")

      raw_aleph_response = adapter.restful_api.patron(resolved_user_id).record(record_id).holds(group_id).put(
        [
          "post_xml=",
          "<hold-request-parameters>",
            "<pickup-location>#{pickup_location}</pickup-location>",
            "<start-interest-date>#{start_interest_date}</start-interest-date>",
            "<last-interest-date>#{last_interest_date}</last-interest-date>",
          "</hold-request-parameters>"
        ].join # !!! do not add linebreaks or something else or it will fail
      )

      reply_code = Nokogiri::XML(raw_aleph_response).at_xpath("//reply-code").try(:content).to_i

      if [1, 2, 19, 21].include?(reply_code)
        raise adapter.class::BadRequestError
      elsif [25].include?(reply_code)
        if raw_aleph_response[/Patron has already requested this item/]
          raise self.class::AlreadyRequestedError
        else
          raise adapter.class::RequestFailedError
        end
      else
        adapter.class::CreateUserHoldRequest::Result.new(
          source: raw_aleph_response
        )
      end
    else
      raise adapter.class::BadRequestError
    end
  else
    raise adapter.class::BadRequestError
  end
end