skala 0.3.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -4
- data/Gemfile +10 -1
- data/LICENSE.txt +17 -18
- data/README.md +1 -34
- data/README.primo_adapter.md +42 -0
- data/bin/console +11 -0
- data/config/initializers/skala.rb +5 -0
- data/config/skala.yml +65 -0
- data/db/migrate/20141006133522_create_skala_users.rb +13 -0
- data/db/migrate/20141006133649_create_skala_user_watch_lists.rb +14 -0
- data/db/migrate/20141006135644_create_skala_user_watch_list_entries.rb +13 -0
- data/db/migrate/20141006140435_create_skala_user_notes.rb +16 -0
- data/lib/skala.rb +36 -3
- data/lib/skala/adapter.rb +122 -4
- data/lib/skala/adapter/authenticate_user.rb +4 -0
- data/lib/skala/adapter/create_user_hold_request.rb +7 -0
- data/lib/skala/adapter/create_user_hold_request/result.rb +10 -0
- data/lib/skala/adapter/delete_user_hold_request.rb +7 -0
- data/lib/skala/adapter/get_record_holdable_items.rb +5 -0
- data/lib/skala/adapter/get_record_holdable_items/result.rb +14 -0
- data/lib/skala/adapter/get_record_items.rb +5 -0
- data/lib/skala/adapter/get_record_items/result.rb +14 -0
- data/lib/skala/adapter/get_records.rb +5 -0
- data/lib/skala/adapter/get_records/result.rb +28 -0
- data/lib/skala/adapter/get_user.rb +4 -0
- data/lib/skala/adapter/get_user_former_loans.rb +5 -0
- data/lib/skala/adapter/get_user_former_loans/result.rb +14 -0
- data/lib/skala/adapter/get_user_hold_requests.rb +5 -0
- data/lib/skala/adapter/get_user_hold_requests/result.rb +14 -0
- data/lib/skala/adapter/get_user_inter_library_loans.rb +5 -0
- data/lib/skala/adapter/get_user_inter_library_loans/result.rb +14 -0
- data/lib/skala/adapter/get_user_loans.rb +5 -0
- data/lib/skala/adapter/get_user_loans/result.rb +14 -0
- data/lib/skala/adapter/get_user_transactions.rb +5 -0
- data/lib/skala/adapter/get_user_transactions/result.rb +14 -0
- data/lib/skala/adapter/operation.rb +2 -0
- data/lib/skala/adapter/operation/request.rb +6 -0
- data/lib/skala/adapter/operation/result.rb +7 -0
- data/lib/skala/adapter/renew_user_loan.rb +7 -0
- data/lib/skala/adapter/renew_user_loan/result.rb +7 -0
- data/lib/skala/adapter/renew_user_loans.rb +5 -0
- data/lib/skala/adapter/renew_user_loans/result.rb +9 -0
- data/lib/skala/adapter/search.rb +6 -0
- data/lib/skala/adapter/search/request.rb +91 -0
- data/lib/skala/adapter/search/request/date_histogram_facet.rb +5 -0
- data/lib/skala/adapter/search/request/facet.rb +29 -0
- data/lib/skala/adapter/search/request/histogram_facet.rb +8 -0
- data/lib/skala/adapter/search/request/ids_query.rb +6 -0
- data/lib/skala/adapter/search/request/match_query.rb +7 -0
- data/lib/skala/adapter/search/request/ordered_terms_query.rb +7 -0
- data/lib/skala/adapter/search/request/query.rb +18 -0
- data/lib/skala/adapter/search/request/query_string_query.rb +9 -0
- data/lib/skala/adapter/search/request/range_facet.rb +10 -0
- data/lib/skala/adapter/search/request/range_facet/range.rb +9 -0
- data/lib/skala/adapter/search/request/range_query.rb +8 -0
- data/lib/skala/adapter/search/request/simple_query_string_query.rb +8 -0
- data/lib/skala/adapter/search/request/sort_request.rb +15 -0
- data/lib/skala/adapter/search/request/terms_facet.rb +8 -0
- data/lib/skala/adapter/search/request/unscored_terms_query.rb +7 -0
- data/lib/skala/adapter/search/result.rb +22 -0
- data/lib/skala/adapter/search/result/facet.rb +15 -0
- data/lib/skala/adapter/search/result/histogram_facet.rb +12 -0
- data/lib/skala/adapter/search/result/histogram_facet/entry.rb +8 -0
- data/lib/skala/adapter/search/result/hit.rb +13 -0
- data/lib/skala/adapter/search/result/terms_facet.rb +14 -0
- data/lib/skala/adapter/search/result/terms_facet/term.rb +8 -0
- data/lib/skala/adapter/update_user.rb +4 -0
- data/lib/skala/aleph_adapter.rb +47 -0
- data/lib/skala/aleph_adapter/authenticate_user.rb +27 -0
- data/lib/skala/aleph_adapter/create_user_hold_request.rb +63 -0
- data/lib/skala/aleph_adapter/delete_user_hold_request.rb +29 -0
- data/lib/skala/aleph_adapter/get_record.rb +22 -0
- data/lib/skala/aleph_adapter/get_record_holdable_items.rb +29 -0
- data/lib/skala/aleph_adapter/get_record_items.rb +111 -0
- data/lib/skala/aleph_adapter/get_user.rb +49 -0
- data/lib/skala/aleph_adapter/get_user_former_loans.rb +21 -0
- data/lib/skala/aleph_adapter/get_user_hold_requests.rb +102 -0
- data/lib/skala/aleph_adapter/get_user_inter_library_loans.rb +66 -0
- data/lib/skala/aleph_adapter/get_user_loans.rb +93 -0
- data/lib/skala/aleph_adapter/get_user_transactions.rb +96 -0
- data/lib/skala/aleph_adapter/renew_user_loan.rb +27 -0
- data/lib/skala/aleph_adapter/renew_user_loans.rb +39 -0
- data/lib/skala/aleph_adapter/resolve_user.rb +19 -0
- data/lib/skala/aleph_adapter/update_user.rb +105 -0
- data/lib/skala/common_attributes.rb +19 -0
- data/lib/skala/elasticsearch_adapter.rb +33 -0
- data/lib/skala/elasticsearch_adapter/search.rb +20 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation.rb +20 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_aggregations.rb +50 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_from.rb +10 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_query.rb +107 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_size.rb +12 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_sort.rb +18 -0
- data/lib/skala/elasticsearch_adapter/search/request_transformation/add_version.rb +10 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation.rb +21 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation/set_facets.rb +44 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation/set_hits.rb +18 -0
- data/lib/skala/elasticsearch_adapter/search/result_transformation/set_total_hits.rb +10 -0
- data/lib/skala/engine.rb +14 -0
- data/lib/skala/get_user_result.rb +14 -0
- data/lib/skala/hold_request.rb +24 -0
- data/lib/skala/item.rb +15 -0
- data/lib/skala/loan.rb +18 -0
- data/lib/skala/primo_adapter.rb +34 -0
- data/lib/skala/primo_adapter/get_records.rb +24 -0
- data/lib/skala/primo_adapter/search.rb +13 -0
- data/lib/skala/primo_adapter/search/request_transformation.rb +40 -0
- data/lib/skala/primo_adapter/search/request_transformation/add_queries.rb +97 -0
- data/lib/skala/primo_adapter/search/request_transformation/add_sort_by_list.rb +37 -0
- data/lib/skala/primo_adapter/search/request_transformation/embed_inner_search_request.rb +13 -0
- data/lib/skala/primo_adapter/search/request_transformation/serialize_target_as_xml.rb +11 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_bulk_size.rb +12 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_institution.rb +12 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_languages.rb +15 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_locations.rb +19 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_on_campus.rb +13 -0
- data/lib/skala/primo_adapter/search/request_transformation/set_start_index.rb +12 -0
- data/lib/skala/primo_adapter/search/request_transformation/setup_inner_search_request.rb +33 -0
- data/lib/skala/primo_adapter/search/request_transformation/setup_target.rb +28 -0
- data/lib/skala/primo_adapter/search/request_transformation/toggle_bool_operator.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation.rb +30 -0
- data/lib/skala/primo_adapter/search/result_transformation/add_hits.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation.rb +46 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_creator.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_description.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_edition.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_fulltext_available.rb +12 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_id.rb +11 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_identifier.rb +46 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_is_part_of.rb +14 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_language.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_metadata.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_openurl.rb +23 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_publisher.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_source.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_subject.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_title.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/doc_transformation/set_year_of_publication.rb +10 -0
- data/lib/skala/primo_adapter/search/result_transformation/fix_primo_facets_bugs.rb +108 -0
- data/lib/skala/primo_adapter/search/result_transformation/parse_search_brief_response.rb +20 -0
- data/lib/skala/primo_adapter/search/result_transformation/set_facets.rb +71 -0
- data/lib/skala/primo_adapter/search/result_transformation/set_total_hits.rb +13 -0
- data/lib/skala/primo_adapter/search/result_transformation/sort_terms_facets_terms.rb +14 -0
- data/lib/skala/primo_adapter/soap_api.rb +15 -0
- data/lib/skala/primo_adapter/soap_api/search_brief.rb +25 -0
- data/lib/skala/record.rb +85 -0
- data/lib/skala/record/identifier.rb +9 -0
- data/lib/skala/record/is_part_of.rb +11 -0
- data/lib/skala/record/link.rb +9 -0
- data/lib/skala/record/relation.rb +9 -0
- data/lib/skala/transaction.rb +13 -0
- data/lib/skala/version.rb +1 -1
- data/skala.gemspec +21 -12
- data/spec/skala/search_request/ordered_terms_query_spec.rb +6 -0
- data/spec/spec_helper.rb +7 -28
- metadata +237 -85
- data/lib/skala/i18n.rb +0 -46
- data/lib/skala/transformation.rb +0 -54
- data/lib/skala/transformation/step.rb +0 -24
- data/spec/assets/locales/de.yml +0 -14
- data/spec/assets/locales/en.yml +0 -9
- data/spec/assets/transformation/some_class.rb +0 -2
- data/spec/skala/adapter/operation_spec.rb +0 -19
- data/spec/skala/adapter_spec.rb +0 -2
- data/spec/skala/i18n_spec.rb +0 -95
- data/spec/skala/transformation/step_spec.rb +0 -36
- data/spec/skala/transformation_spec.rb +0 -89
- data/spec/skala_spec.rb +0 -2
@@ -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,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,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,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,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
|