skala 0.3.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -4
  3. data/Gemfile +10 -1
  4. data/LICENSE.txt +17 -18
  5. data/README.md +1 -34
  6. data/README.primo_adapter.md +42 -0
  7. data/bin/console +11 -0
  8. data/config/initializers/skala.rb +5 -0
  9. data/config/skala.yml +65 -0
  10. data/db/migrate/20141006133522_create_skala_users.rb +13 -0
  11. data/db/migrate/20141006133649_create_skala_user_watch_lists.rb +14 -0
  12. data/db/migrate/20141006135644_create_skala_user_watch_list_entries.rb +13 -0
  13. data/db/migrate/20141006140435_create_skala_user_notes.rb +16 -0
  14. data/lib/skala.rb +36 -3
  15. data/lib/skala/adapter.rb +122 -4
  16. data/lib/skala/adapter/authenticate_user.rb +4 -0
  17. data/lib/skala/adapter/create_user_hold_request.rb +7 -0
  18. data/lib/skala/adapter/create_user_hold_request/result.rb +10 -0
  19. data/lib/skala/adapter/delete_user_hold_request.rb +7 -0
  20. data/lib/skala/adapter/get_record_holdable_items.rb +5 -0
  21. data/lib/skala/adapter/get_record_holdable_items/result.rb +14 -0
  22. data/lib/skala/adapter/get_record_items.rb +5 -0
  23. data/lib/skala/adapter/get_record_items/result.rb +14 -0
  24. data/lib/skala/adapter/get_records.rb +5 -0
  25. data/lib/skala/adapter/get_records/result.rb +28 -0
  26. data/lib/skala/adapter/get_user.rb +4 -0
  27. data/lib/skala/adapter/get_user_former_loans.rb +5 -0
  28. data/lib/skala/adapter/get_user_former_loans/result.rb +14 -0
  29. data/lib/skala/adapter/get_user_hold_requests.rb +5 -0
  30. data/lib/skala/adapter/get_user_hold_requests/result.rb +14 -0
  31. data/lib/skala/adapter/get_user_inter_library_loans.rb +5 -0
  32. data/lib/skala/adapter/get_user_inter_library_loans/result.rb +14 -0
  33. data/lib/skala/adapter/get_user_loans.rb +5 -0
  34. data/lib/skala/adapter/get_user_loans/result.rb +14 -0
  35. data/lib/skala/adapter/get_user_transactions.rb +5 -0
  36. data/lib/skala/adapter/get_user_transactions/result.rb +14 -0
  37. data/lib/skala/adapter/operation.rb +2 -0
  38. data/lib/skala/adapter/operation/request.rb +6 -0
  39. data/lib/skala/adapter/operation/result.rb +7 -0
  40. data/lib/skala/adapter/renew_user_loan.rb +7 -0
  41. data/lib/skala/adapter/renew_user_loan/result.rb +7 -0
  42. data/lib/skala/adapter/renew_user_loans.rb +5 -0
  43. data/lib/skala/adapter/renew_user_loans/result.rb +9 -0
  44. data/lib/skala/adapter/search.rb +6 -0
  45. data/lib/skala/adapter/search/request.rb +91 -0
  46. data/lib/skala/adapter/search/request/date_histogram_facet.rb +5 -0
  47. data/lib/skala/adapter/search/request/facet.rb +29 -0
  48. data/lib/skala/adapter/search/request/histogram_facet.rb +8 -0
  49. data/lib/skala/adapter/search/request/ids_query.rb +6 -0
  50. data/lib/skala/adapter/search/request/match_query.rb +7 -0
  51. data/lib/skala/adapter/search/request/ordered_terms_query.rb +7 -0
  52. data/lib/skala/adapter/search/request/query.rb +18 -0
  53. data/lib/skala/adapter/search/request/query_string_query.rb +9 -0
  54. data/lib/skala/adapter/search/request/range_facet.rb +10 -0
  55. data/lib/skala/adapter/search/request/range_facet/range.rb +9 -0
  56. data/lib/skala/adapter/search/request/range_query.rb +8 -0
  57. data/lib/skala/adapter/search/request/simple_query_string_query.rb +8 -0
  58. data/lib/skala/adapter/search/request/sort_request.rb +15 -0
  59. data/lib/skala/adapter/search/request/terms_facet.rb +8 -0
  60. data/lib/skala/adapter/search/request/unscored_terms_query.rb +7 -0
  61. data/lib/skala/adapter/search/result.rb +22 -0
  62. data/lib/skala/adapter/search/result/facet.rb +15 -0
  63. data/lib/skala/adapter/search/result/histogram_facet.rb +12 -0
  64. data/lib/skala/adapter/search/result/histogram_facet/entry.rb +8 -0
  65. data/lib/skala/adapter/search/result/hit.rb +13 -0
  66. data/lib/skala/adapter/search/result/terms_facet.rb +14 -0
  67. data/lib/skala/adapter/search/result/terms_facet/term.rb +8 -0
  68. data/lib/skala/adapter/update_user.rb +4 -0
  69. data/lib/skala/aleph_adapter.rb +47 -0
  70. data/lib/skala/aleph_adapter/authenticate_user.rb +27 -0
  71. data/lib/skala/aleph_adapter/create_user_hold_request.rb +63 -0
  72. data/lib/skala/aleph_adapter/delete_user_hold_request.rb +29 -0
  73. data/lib/skala/aleph_adapter/get_record.rb +22 -0
  74. data/lib/skala/aleph_adapter/get_record_holdable_items.rb +29 -0
  75. data/lib/skala/aleph_adapter/get_record_items.rb +111 -0
  76. data/lib/skala/aleph_adapter/get_user.rb +49 -0
  77. data/lib/skala/aleph_adapter/get_user_former_loans.rb +21 -0
  78. data/lib/skala/aleph_adapter/get_user_hold_requests.rb +102 -0
  79. data/lib/skala/aleph_adapter/get_user_inter_library_loans.rb +66 -0
  80. data/lib/skala/aleph_adapter/get_user_loans.rb +93 -0
  81. data/lib/skala/aleph_adapter/get_user_transactions.rb +96 -0
  82. data/lib/skala/aleph_adapter/renew_user_loan.rb +27 -0
  83. data/lib/skala/aleph_adapter/renew_user_loans.rb +39 -0
  84. data/lib/skala/aleph_adapter/resolve_user.rb +19 -0
  85. data/lib/skala/aleph_adapter/update_user.rb +105 -0
  86. data/lib/skala/common_attributes.rb +19 -0
  87. data/lib/skala/elasticsearch_adapter.rb +33 -0
  88. data/lib/skala/elasticsearch_adapter/search.rb +20 -0
  89. data/lib/skala/elasticsearch_adapter/search/request_transformation.rb +20 -0
  90. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_aggregations.rb +50 -0
  91. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_from.rb +10 -0
  92. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_query.rb +107 -0
  93. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_size.rb +12 -0
  94. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_sort.rb +18 -0
  95. data/lib/skala/elasticsearch_adapter/search/request_transformation/add_version.rb +10 -0
  96. data/lib/skala/elasticsearch_adapter/search/result_transformation.rb +21 -0
  97. data/lib/skala/elasticsearch_adapter/search/result_transformation/set_facets.rb +44 -0
  98. data/lib/skala/elasticsearch_adapter/search/result_transformation/set_hits.rb +18 -0
  99. data/lib/skala/elasticsearch_adapter/search/result_transformation/set_total_hits.rb +10 -0
  100. data/lib/skala/engine.rb +14 -0
  101. data/lib/skala/get_user_result.rb +14 -0
  102. data/lib/skala/hold_request.rb +24 -0
  103. data/lib/skala/item.rb +15 -0
  104. data/lib/skala/loan.rb +18 -0
  105. data/lib/skala/primo_adapter.rb +34 -0
  106. data/lib/skala/primo_adapter/get_records.rb +24 -0
  107. data/lib/skala/primo_adapter/search.rb +13 -0
  108. data/lib/skala/primo_adapter/search/request_transformation.rb +40 -0
  109. data/lib/skala/primo_adapter/search/request_transformation/add_queries.rb +97 -0
  110. data/lib/skala/primo_adapter/search/request_transformation/add_sort_by_list.rb +37 -0
  111. data/lib/skala/primo_adapter/search/request_transformation/embed_inner_search_request.rb +13 -0
  112. data/lib/skala/primo_adapter/search/request_transformation/serialize_target_as_xml.rb +11 -0
  113. data/lib/skala/primo_adapter/search/request_transformation/set_bulk_size.rb +12 -0
  114. data/lib/skala/primo_adapter/search/request_transformation/set_institution.rb +12 -0
  115. data/lib/skala/primo_adapter/search/request_transformation/set_languages.rb +15 -0
  116. data/lib/skala/primo_adapter/search/request_transformation/set_locations.rb +19 -0
  117. data/lib/skala/primo_adapter/search/request_transformation/set_on_campus.rb +13 -0
  118. data/lib/skala/primo_adapter/search/request_transformation/set_start_index.rb +12 -0
  119. data/lib/skala/primo_adapter/search/request_transformation/setup_inner_search_request.rb +33 -0
  120. data/lib/skala/primo_adapter/search/request_transformation/setup_target.rb +28 -0
  121. data/lib/skala/primo_adapter/search/request_transformation/toggle_bool_operator.rb +13 -0
  122. data/lib/skala/primo_adapter/search/result_transformation.rb +30 -0
  123. data/lib/skala/primo_adapter/search/result_transformation/add_hits.rb +13 -0
  124. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation.rb +46 -0
  125. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_creator.rb +10 -0
  126. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_description.rb +10 -0
  127. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_edition.rb +10 -0
  128. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_fulltext_available.rb +12 -0
  129. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_id.rb +11 -0
  130. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_identifier.rb +46 -0
  131. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_is_part_of.rb +14 -0
  132. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_language.rb +10 -0
  133. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_metadata.rb +13 -0
  134. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_openurl.rb +23 -0
  135. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_publisher.rb +10 -0
  136. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_source.rb +10 -0
  137. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_subject.rb +10 -0
  138. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_title.rb +10 -0
  139. data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_year_of_publication.rb +10 -0
  140. data/lib/skala/primo_adapter/search/result_transformation/fix_primo_facets_bugs.rb +108 -0
  141. data/lib/skala/primo_adapter/search/result_transformation/parse_search_brief_response.rb +20 -0
  142. data/lib/skala/primo_adapter/search/result_transformation/set_facets.rb +71 -0
  143. data/lib/skala/primo_adapter/search/result_transformation/set_total_hits.rb +13 -0
  144. data/lib/skala/primo_adapter/search/result_transformation/sort_terms_facets_terms.rb +14 -0
  145. data/lib/skala/primo_adapter/soap_api.rb +15 -0
  146. data/lib/skala/primo_adapter/soap_api/search_brief.rb +25 -0
  147. data/lib/skala/record.rb +85 -0
  148. data/lib/skala/record/identifier.rb +9 -0
  149. data/lib/skala/record/is_part_of.rb +11 -0
  150. data/lib/skala/record/link.rb +9 -0
  151. data/lib/skala/record/relation.rb +9 -0
  152. data/lib/skala/transaction.rb +13 -0
  153. data/lib/skala/version.rb +1 -1
  154. data/skala.gemspec +21 -12
  155. data/spec/skala/search_request/ordered_terms_query_spec.rb +6 -0
  156. data/spec/spec_helper.rb +7 -28
  157. metadata +237 -85
  158. data/lib/skala/i18n.rb +0 -46
  159. data/lib/skala/transformation.rb +0 -54
  160. data/lib/skala/transformation/step.rb +0 -24
  161. data/spec/assets/locales/de.yml +0 -14
  162. data/spec/assets/locales/en.yml +0 -9
  163. data/spec/assets/transformation/some_class.rb +0 -2
  164. data/spec/skala/adapter/operation_spec.rb +0 -19
  165. data/spec/skala/adapter_spec.rb +0 -2
  166. data/spec/skala/i18n_spec.rb +0 -95
  167. data/spec/skala/transformation/step_spec.rb +0 -36
  168. data/spec/skala/transformation_spec.rb +0 -89
  169. data/spec/skala_spec.rb +0 -2
@@ -0,0 +1,6 @@
1
+ require_relative "../request"
2
+ require_relative "./query"
3
+
4
+ class Skala::Adapter::Search::Request::IdsQuery < Skala::Adapter::Search::Request::Query
5
+ attribute :query, Array[BasicObject], required: true
6
+ end
@@ -0,0 +1,7 @@
1
+ require_relative "../request"
2
+ require_relative "./query"
3
+
4
+ class Skala::Adapter::Search::Request::MatchQuery < Skala::Adapter::Search::Request::Query
5
+ attribute :field, String, required: true
6
+ attribute :query, String, required: true
7
+ end
@@ -0,0 +1,7 @@
1
+ require_relative "../request"
2
+ require_relative "./query"
3
+
4
+ class Skala::Adapter::Search::Request::OrderedTermsQuery < Skala::Adapter::Search::Request::Query
5
+ attribute :field, String, required: true
6
+ attribute :terms, Array[BasicObject], required: true
7
+ end
@@ -0,0 +1,18 @@
1
+ require_relative "../request"
2
+
3
+ class Skala::Adapter::Search::Request::Query
4
+ include Virtus.model
5
+
6
+ attribute :exclude, Axiom::Types::Boolean, default: false
7
+
8
+ # unless given, interfere the query type from the class name
9
+ attribute :type, String, default: -> (instance, _) do
10
+ query_name = instance.class.to_s.demodulize.underscore
11
+
12
+ if (splitted_query_name = query_name.split("_")).last == "query"
13
+ splitted_query_name[0..-2].join("_")
14
+ else
15
+ query_name
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "../request"
2
+ require_relative "./query"
3
+
4
+ class Skala::Adapter::Search::Request::QueryStringQuery < Skala::Adapter::Search::Request::Query
5
+ attribute :default_field, String, lazy: true
6
+ attribute :default_operator, String, default: "AND"
7
+ attribute :fields, Array[String], laze: true
8
+ attribute :query, String, required: true
9
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "../request"
2
+ require_relative "./facet"
3
+
4
+ class Skala::Adapter::Search::Request::RangeFacet < Skala::Adapter::Search::Request::Facet
5
+ require_relative "./range_facet/range"
6
+
7
+ attribute :field, String, required: true
8
+ attribute :name, String, required: true
9
+ attribute :ranges, Array[Range], required: true
10
+ end
@@ -0,0 +1,9 @@
1
+ require_relative "../range_facet"
2
+
3
+ class Skala::Adapter::Search::Request::RangeFacet::Range
4
+ include Virtus.model
5
+
6
+ attribute :from, BasicObject, lazy: true
7
+ attribute :key, String, required: true
8
+ attribute :to, BasicObject, lazy: true
9
+ end
@@ -0,0 +1,8 @@
1
+ require_relative "../request"
2
+ require_relative "./query"
3
+
4
+ class Skala::Adapter::Search::Request::RangeQuery < Skala::Adapter::Search::Request::Query
5
+ attribute :field, String, required: true
6
+ attribute :gte, BasicObject, lazy: true
7
+ attribute :lte, BasicObject, lazy: true
8
+ end
@@ -0,0 +1,8 @@
1
+ require_relative "../request"
2
+ require_relative "./query"
3
+
4
+ class Skala::Adapter::Search::Request::SimpleQueryStringQuery < Skala::Adapter::Search::Request::Query
5
+ attribute :default_operator, String, default: "AND"
6
+ attribute :fields, Array[String], required: true
7
+ attribute :query, String, required: true
8
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "../request"
2
+
3
+ class Skala::Adapter::Search::Request::SortRequest
4
+ include Virtus.model
5
+
6
+ class Order < Virtus::Attribute
7
+ def coerce(value)
8
+ value = value.try(:to_s).try(:downcase)
9
+ ["asc", "desc"].include?(value) ? value : nil
10
+ end
11
+ end
12
+
13
+ attribute :field, String, required: true
14
+ attribute :order, Order, lazy: true
15
+ end
@@ -0,0 +1,8 @@
1
+ require_relative "../request"
2
+ require_relative "./facet"
3
+
4
+ class Skala::Adapter::Search::Request::TermsFacet < Skala::Adapter::Search::Request::Facet
5
+ attribute :field, String, required: true
6
+ attribute :name, String, required: true
7
+ attribute :size, Integer, lazy: true
8
+ end
@@ -0,0 +1,7 @@
1
+ require_relative "../request"
2
+ require_relative "./query"
3
+
4
+ class Skala::Adapter::Search::Request::UnscoredTermsQuery < Skala::Adapter::Search::Request::Query
5
+ attribute :field, String, required: true
6
+ attribute :terms, Array[BasicObject], required: true
7
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "../search"
2
+
3
+ class Skala::Adapter::Search::Result < Skala::Adapter::Operation::Result
4
+ include Enumerable
5
+ include Virtus.model
6
+
7
+ # facets
8
+ require_relative "./result/facet"
9
+ require_relative "./result/histogram_facet"
10
+ require_relative "./result/terms_facet"
11
+
12
+ # other
13
+ require_relative "./result/hit"
14
+
15
+ attribute :facets, Array[Facet], lazy: true
16
+ attribute :hits, Array[Hit], lazy: true
17
+ attribute :total_hits, Integer, default: 0
18
+
19
+ def each
20
+ block_given? ? hits.each { |_element| yield _element } : hits.each
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "../result"
2
+
3
+ class Skala::Adapter::Search::Result::Facet
4
+ include Virtus.model
5
+
6
+ attribute :type, String, default: -> (instance, _) do
7
+ class_name = instance.class.to_s.demodulize.underscore
8
+
9
+ if (splitted_class_name = class_name.split("_")).last == "facet"
10
+ splitted_class_name[0..-2].join("_")
11
+ else
12
+ class_name
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ require_relative "../result"
2
+ require_relative "./facet"
3
+
4
+ class Skala::Adapter::Search::Result::HistogramFacet < Skala::Adapter::Search::Result::Facet
5
+ require_relative "./histogram_facet/entry"
6
+
7
+ include Virtus.model
8
+
9
+ attribute :entries, Array[Entry]
10
+ attribute :field, String
11
+ attribute :name, String, required: true
12
+ end
@@ -0,0 +1,8 @@
1
+ require_relative "../histogram_facet"
2
+
3
+ class Skala::Adapter::Search::Result::HistogramFacet::Entry
4
+ include Virtus.model
5
+
6
+ attribute :count, Integer, required: true
7
+ attribute :key, String, required: true
8
+ end
@@ -0,0 +1,13 @@
1
+ require "skala/record"
2
+ require_relative "../result"
3
+
4
+ class Skala::Adapter::Search::Result::Hit
5
+ include Virtus.model
6
+
7
+ attribute :id, String, required: true
8
+ attribute :index, String
9
+ attribute :score, BasicObject # TODO: can we set this to Float ?
10
+ attribute :type, String
11
+ attribute :record, Skala::Record
12
+ attribute :version, Integer
13
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "../result"
2
+ require_relative "./facet"
3
+
4
+ class Skala::Adapter::Search::Result::TermsFacet < Skala::Adapter::Search::Result::Facet
5
+ require_relative "./terms_facet/term"
6
+
7
+ include Virtus.model
8
+
9
+ attribute :field, String
10
+ attribute :name, String
11
+ attribute :terms, Array[Term]
12
+
13
+ # attr_accessor :i18n_key # TODO: remove
14
+ end
@@ -0,0 +1,8 @@
1
+ require_relative "../terms_facet"
2
+
3
+ class Skala::Adapter::Search::Result::TermsFacet::Term
4
+ include Virtus.model
5
+
6
+ attribute :count, Integer, required: true
7
+ attribute :term, String, required: true
8
+ end
@@ -0,0 +1,4 @@
1
+ require_relative "../adapter"
2
+
3
+ class Skala::Adapter::UpdateUser < Skala::Adapter::Operation
4
+ end
@@ -0,0 +1,47 @@
1
+ require "active_support"
2
+ require "active_support/core_ext"
3
+ require "aleph_api"
4
+ require "skala/adapter"
5
+
6
+ class Skala::AlephAdapter < Skala::Adapter
7
+ require_relative "aleph_adapter/authenticate_user"
8
+ require_relative "aleph_adapter/create_user_hold_request"
9
+ require_relative "aleph_adapter/delete_user_hold_request"
10
+ #require_relative "aleph_adapter/get_record"
11
+ require_relative "aleph_adapter/get_record_holdable_items"
12
+ require_relative "aleph_adapter/get_record_items"
13
+ require_relative "aleph_adapter/get_user"
14
+ require_relative "aleph_adapter/get_user_former_loans"
15
+ require_relative "aleph_adapter/get_user_hold_requests"
16
+ require_relative "aleph_adapter/get_user_inter_library_loans"
17
+ require_relative "aleph_adapter/get_user_loans"
18
+ require_relative "aleph_adapter/get_user_transactions"
19
+ require_relative "aleph_adapter/renew_user_loan"
20
+ require_relative "aleph_adapter/renew_user_loans"
21
+ require_relative "aleph_adapter/update_user"
22
+
23
+ attr_accessor :default_document_base
24
+ attr_accessor :default_user_library
25
+ attr_accessor :restful_api_url
26
+ attr_accessor :x_services_url
27
+
28
+ def initialize(options = {})
29
+ HashWithIndifferentAccess.new(options).try do |_options|
30
+ self.default_document_base = _options[:default_document_base]
31
+ self.default_user_library = _options[:default_user_library]
32
+ self.restful_api_url = _options[:restful_api_url]
33
+ self.x_services_url = _options[:x_services_url]
34
+ end
35
+ end
36
+
37
+ #
38
+ # apis used to implemented the operations
39
+ #
40
+ def restful_api
41
+ @restful_api ||= AlephApi::RestfulApiClient.new(url: @restful_api_url)
42
+ end
43
+
44
+ def x_services
45
+ @x_services ||= AlephApi::XServicesClient.new(url: @x_services_url)
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ require_relative "../aleph_adapter"
2
+
3
+ module Skala
4
+ class AlephAdapter::AuthenticateUser
5
+ def initialize(adapter)
6
+ @adapter = adapter
7
+ end
8
+
9
+ def call(user_id, password)
10
+ @adapter.x_services.post(
11
+ op: :"bor-auth",
12
+ bor_id: user_id,
13
+ library: @adapter.default_user_library,
14
+ verification: password
15
+ )
16
+ .try do |_response|
17
+ if _response.include?("<z303>")
18
+ true
19
+ elsif _response.include?("error")
20
+ false
21
+ else
22
+ StandardError.new
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,63 @@
1
+ require "nokogiri"
2
+ require "skala/adapter/create_user_hold_request"
3
+ require_relative "../aleph_adapter"
4
+ require_relative "./resolve_user"
5
+
6
+ class Skala::AlephAdapter::CreateUserHoldRequest < Skala::Adapter::CreateUserHoldRequest
7
+ include parent::ResolveUser
8
+
9
+ def call(username, document_number, options = {})
10
+ get_record_items_result = adapter.get_record_items(
11
+ document_number, {
12
+ username: username,
13
+ }
14
+ )
15
+
16
+ if first_holdable_item = get_record_items_result.items.find(&:hold_request_can_be_created)
17
+ document_base = options[:document_base] || adapter.default_document_base
18
+ record_id = "#{document_base}#{document_number}"
19
+ resolved_user_id = resolve_user(username)
20
+
21
+ raw_aleph_response = adapter.restful_api.patron(resolved_user_id).record(record_id).holds.get(view: :full)
22
+ doc = Nokogiri::XML(raw_aleph_response)
23
+
24
+ if element = doc.at_xpath("//group/item-status[text() = '#{first_holdable_item.item_status}']/parent::*")
25
+ group_id = element.attr("href").split("/").last
26
+ pickup_location = element.xpath("./pickup-locations/pickup-location").first.try(:attr, "code")
27
+ start_interest_date = Date.today.strftime("%Y%m%d")
28
+ last_interest_date = (Date.today + 1.year).strftime("%Y%m%d")
29
+
30
+ raw_aleph_response = adapter.restful_api.patron(resolved_user_id).record(record_id).holds(group_id).put(
31
+ [
32
+ "post_xml=",
33
+ "<hold-request-parameters>",
34
+ "<pickup-location>#{pickup_location}</pickup-location>",
35
+ "<start-interest-date>#{start_interest_date}</start-interest-date>",
36
+ "<last-interest-date>#{last_interest_date}</last-interest-date>",
37
+ "</hold-request-parameters>"
38
+ ].join # !!! do not add linebreaks or something else or it will fail
39
+ )
40
+
41
+ reply_code = Nokogiri::XML(raw_aleph_response).at_xpath("//reply-code").try(:content).to_i
42
+
43
+ if [1, 2, 19, 21].include?(reply_code)
44
+ raise adapter.class::BadRequestError
45
+ elsif [25].include?(reply_code)
46
+ if raw_aleph_response[/Patron has already requested this item/]
47
+ raise self.class::AlreadyRequestedError
48
+ else
49
+ raise adapter.class::RequestFailedError
50
+ end
51
+ else
52
+ adapter.class::CreateUserHoldRequest::Result.new(
53
+ source: raw_aleph_response
54
+ )
55
+ end
56
+ else
57
+ raise adapter.class::BadRequestError
58
+ end
59
+ else
60
+ raise adapter.class::BadRequestError
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,29 @@
1
+ require "nokogiri"
2
+ require "skala/adapter/delete_user_hold_request"
3
+ require_relative "../aleph_adapter"
4
+ require_relative "./resolve_user"
5
+
6
+ class Skala::AlephAdapter::DeleteUserHoldRequest < Skala::Adapter::DeleteUserHoldRequest
7
+ include parent::ResolveUser
8
+
9
+ def call(username, hold_request_id, options = {})
10
+ document_base = options[:document_base] || adapter.default_document_base
11
+ record_id = "#{document_base}#{record_id}"
12
+ resolved_user_id = resolve_user(username)
13
+
14
+ raw_aleph_response = @adapter.restful_api.patron(resolved_user_id).circulationActions.requests.holds(hold_request_id).delete
15
+ reply_code = Nokogiri::XML(raw_aleph_response).at_xpath("//reply-code").try(:content).try(:to_i)
16
+
17
+ if reply_code == 0
18
+ adapter.class::DeleteUserHoldRequest::Result.new(
19
+ source: raw_aleph_response
20
+ )
21
+ else
22
+ if reply_code == 8
23
+ raise self.class::HoldRequestMissingError
24
+ else
25
+ raise adapter.class::RequestFailedError
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "../aleph_adapter"
2
+
3
+ module Skala
4
+ class AlephAdapter::GetRecord
5
+ def initialize(adapter)
6
+ @adapter = adapter
7
+ end
8
+
9
+ def call(record_id)
10
+ get_record = @adapter.restful_api.record(record_id).get(view: :full)
11
+
12
+ {
13
+ "_type" => "record",
14
+ "_id" => record_id,
15
+ "fields" => {
16
+ "record" => "#{get_record[/<?.*?>/]}#{WeakXml.find("<record>", get_record).to_s}"
17
+ },
18
+ "_source" => get_record
19
+ }
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ require "nokogiri"
2
+ require "skala/adapter/get_record_holdable_items"
3
+ require_relative "../aleph_adapter"
4
+ require_relative "./get_record_items"
5
+
6
+ class Skala::AlephAdapter::GetRecordHoldableItems < Skala::Adapter::GetRecordHoldableItems
7
+ def call(document_number, username, options = {})
8
+ get_record_items_result = get_record_items(document_number, options.merge(username: username))
9
+
10
+ self.class::Result.new(
11
+ holdable_items: holdable_items(get_record_items_result),
12
+ source: get_record_items_result.source
13
+ )
14
+ end
15
+
16
+ private
17
+
18
+ def get_record_items(*args)
19
+ adapter.class::GetRecordItems.new(adapter).call(*args) # adapter.class is important to get inherited op
20
+ end
21
+
22
+ def holdable_items(get_record_items_result)
23
+ source_doc = Nokogiri::XML(get_record_items_result.source)
24
+
25
+ get_record_items_result.items.select do |_item|
26
+ !!source_doc.at_xpath("//item/info[@type='HoldRequest' and contains(@href, _item.id) and @allowed='Y']")
27
+ end
28
+ end
29
+ end