dor-services-client 12.16.0 → 12.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec7edce5ca401aae71ab8e4b98b1b1c44c646e4565f25ba615ff8b0536ad807f
4
- data.tar.gz: faabe27c830efb9135f1d171ca6a78193ce46c5edf98455850a9d555c470e336
3
+ metadata.gz: a474115832894037ecf11cebc49b133d19d18c5bf43eb24c41a58a8efd7fd0a3
4
+ data.tar.gz: c39cdb3823ebfcc28acc4cbff90a680560507c3099f15826abc1a2d122b17839
5
5
  SHA512:
6
- metadata.gz: 1150fe0e08f2ea9a6bfe9a9bb198c85e661c0cb856b4d4c50392da8c69ce478d81cbc88d6c9936f95f2cedefbe3ab147944b69764fd3b0cd52ed7761eda1ae2d
7
- data.tar.gz: 72c6d2a0c24e2cce44ead61de2f5eed38234b72fcbf75a0131e14e0c5b4126b2d0a3cbeeb69e18d614061a43f5a409791956f14cedf168c900576b6bd6b47a15
6
+ metadata.gz: e986337c48ceab9a1a84479caa51f580c1e6cd6ab5c876fb85c64c5a5985824f23d86b9a4b9ab6a548c482532f23859e726b21f0063325f3d82c42d4f8c32da1
7
+ data.tar.gz: 86170854e8d54022a93e7a70f8527d1028153ab3f0cd1d49ac4cedb8caec39e8b1836a4b3832e38b479848a53cd4c822f2c69ddeefa5f75956c49a0f88677c9d
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dor-services-client (12.16.0)
4
+ dor-services-client (12.18.0)
5
5
  activesupport (>= 4.2, < 8)
6
6
  cocina-models (~> 0.91.0)
7
7
  deprecation
data/README.md CHANGED
@@ -141,6 +141,9 @@ object_client.version.close
141
141
  # Return the Cocina metadata
142
142
  object_client.find
143
143
 
144
+ # Returns "lite" Cocina metadata (excluding specified attributes)
145
+ object_client.find_lite(structural: false, geographic: false)
146
+
144
147
  # Query for an object's collections
145
148
  object_client.collections
146
149
 
@@ -24,8 +24,7 @@ module Dor
24
24
  # @raise [UnexpectedResponse] when the response is not successful.
25
25
  def start(params = {})
26
26
  resp = connection.post do |req|
27
- req.url path
28
- req.params = params
27
+ req.url with_querystring(url: path, params: params)
29
28
  end
30
29
  return true if resp.success?
31
30
 
@@ -6,7 +6,7 @@ module Dor
6
6
  module Services
7
7
  class Client
8
8
  # API calls that are about a repository object
9
- class Object < VersionedService
9
+ class Object < VersionedService # rubocop:disable Metrics/ClassLength
10
10
  extend Deprecation
11
11
  attr_reader :object_identifier
12
12
 
@@ -52,6 +52,35 @@ module Dor
52
52
  build_cocina_from_response(resp, validate: validate)
53
53
  end
54
54
 
55
+ BASE_ALLOWED_FIELDS = %i[external_identifier cocina_version label version administrative description].freeze
56
+ DRO_ALLOWED_FIELDS = BASE_ALLOWED_FIELDS + %i[content_type access identification structural geographic]
57
+
58
+ # rubocop:disable Metrics/MethodLength
59
+ # rubocop:disable Metrics/AbcSize
60
+ # rubocop:disable Metrics/CyclomaticComplexity
61
+ # rubocop:disable Metrics/ParameterLists
62
+ def find_lite(administrative: true, description: true, access: true, structural: true, identification: true, geographic: true)
63
+ fields = []
64
+ fields << :administrative if administrative
65
+ fields << :description if description
66
+ fields << :access if access
67
+ fields << :structural if structural
68
+ fields << :identification if identification
69
+ fields << :geographic if geographic
70
+
71
+ resp = connection.post '/graphql', query(fields),
72
+ 'Content-Type' => 'application/json'
73
+ raise_exception_based_on_response!(resp) unless resp.success?
74
+ resp_json = JSON.parse(resp.body)
75
+ # GraphQL returns 200 even when an error
76
+ raise_graphql_exception(resp, resp_json)
77
+ Cocina::Models.build_lite(resp_json['data']['cocinaObject'])
78
+ end
79
+ # rubocop:enable Metrics/MethodLength
80
+ # rubocop:enable Metrics/AbcSize
81
+ # rubocop:enable Metrics/CyclomaticComplexity
82
+ # rubocop:enable Metrics/ParameterLists
83
+
55
84
  # Get a list of the collections. (Similar to Valkyrie's find_inverse_references_by)
56
85
  # @raise [UnexpectedResponse] if the request is unsuccessful.
57
86
  # @return [Array<Cocina::Models::DRO>]
@@ -140,6 +169,35 @@ module Dor
140
169
  def object_path
141
170
  "#{api_version}/objects/#{object_identifier}"
142
171
  end
172
+
173
+ DEFAULT_FIELDS = %i[externalIdentifier type version label cocinaVersion].freeze
174
+
175
+ def query(fields)
176
+ all_fields = DEFAULT_FIELDS + fields
177
+ {
178
+ query:
179
+ <<~GQL
180
+ {
181
+ cocinaObject(externalIdentifier: "#{object_identifier}") {
182
+ #{all_fields.join("\n")}
183
+ }
184
+ }
185
+ GQL
186
+ }.to_json
187
+ end
188
+
189
+ def raise_graphql_exception(resp, resp_json)
190
+ return unless resp_json['errors'].present?
191
+
192
+ exception_class = not_found_exception?(resp_json['errors'].first) ? NotFoundResponse : UnexpectedResponse
193
+ raise exception_class.new(response: resp,
194
+ object_identifier: object_identifier,
195
+ graphql_errors: resp_json['errors'])
196
+ end
197
+
198
+ def not_found_exception?(error)
199
+ error['message'] == 'Cocina object not found'
200
+ end
143
201
  end
144
202
  end
145
203
  end
@@ -59,9 +59,8 @@ module Dor
59
59
  # @return [Cocina::Models::DROWithMetadata|CollectionWithMetadata|AdminPolicyWithMetadata] cocina model with updated version
60
60
  def open(**params)
61
61
  resp = connection.post do |req|
62
- req.url open_new_version_path
62
+ req.url with_querystring(url: open_new_version_path, params: params)
63
63
  req.headers['Content-Type'] = 'application/json'
64
- req.body = params.to_json if params.any?
65
64
  end
66
65
 
67
66
  raise_exception_based_on_response!(resp) unless resp.success?
@@ -79,9 +78,8 @@ module Dor
79
78
  # @return [String] a message confirming successful closing
80
79
  def close(**params)
81
80
  resp = connection.post do |req|
82
- req.url close_version_path
81
+ req.url with_querystring(url: close_version_path, params: params)
83
82
  req.headers['Content-Type'] = 'application/json'
84
- req.body = params.to_json if params.any?
85
83
  end
86
84
  return resp.body if resp.success?
87
85
 
@@ -14,11 +14,10 @@ module Dor
14
14
  # @return [Cocina::Models::DROWithMetadata,Cocina::Models::CollectionWithMetadata,Cocina::Models::AdminPolicyWithMetadata] the returned model
15
15
  def register(params:, assign_doi: false, validate: false)
16
16
  resp = connection.post do |req|
17
- req.url objects_path
17
+ req.url with_querystring(url: objects_path, params: { assign_doi: assign_doi })
18
18
  req.headers['Content-Type'] = 'application/json'
19
19
  # asking the service to return JSON (else it'll be plain text)
20
20
  req.headers['Accept'] = 'application/json'
21
- req.params[:assign_doi] = true if assign_doi
22
21
  req.body = params.to_json
23
22
  end
24
23
 
@@ -3,7 +3,7 @@
3
3
  module Dor
4
4
  module Services
5
5
  class Client
6
- VERSION = '12.16.0'
6
+ VERSION = '12.18.0'
7
7
  end
8
8
  end
9
9
  end
@@ -25,6 +25,12 @@ module Dor
25
25
  AsyncResult.new(url: url)
26
26
  end
27
27
 
28
+ def with_querystring(url:, params:)
29
+ return url if params.blank?
30
+
31
+ "#{url}?#{params.to_query}"
32
+ end
33
+
28
34
  private
29
35
 
30
36
  attr_reader :connection, :api_version
@@ -5,6 +5,7 @@ require 'active_support/core_ext/module/delegation'
5
5
  require 'active_support/core_ext/object/blank'
6
6
  require 'active_support/json'
7
7
  require 'active_support/core_ext/object/json'
8
+ require 'active_support/core_ext/object/to_query'
8
9
  require 'cocina/models'
9
10
  require 'faraday'
10
11
  require 'faraday/retry'
@@ -42,17 +43,21 @@ module Dor
42
43
  # @param [Faraday::Response] response
43
44
  # @param [String] object_identifier (nil)
44
45
  # @param [Hash<String,Object>] errors (nil) the JSON-API errors object
46
+ # @param [Hash<String,Object>] graphql_errors (nil) the GraphQL errors object
45
47
  # rubocop:disable Lint/MissingSuper
46
- def initialize(response:, object_identifier: nil, errors: nil)
48
+ def initialize(response:, object_identifier: nil, errors: nil, graphql_errors: nil)
47
49
  @response = response
48
50
  @object_identifier = object_identifier
49
51
  @errors = errors
52
+ @graphql_errors = graphql_errors
50
53
  end
51
54
  # rubocop:enable Lint/MissingSuper
52
55
 
53
- attr_accessor :errors
56
+ attr_accessor :errors, :graphql_errors
54
57
 
55
58
  def to_s
59
+ # For GraphQL errors, see https://graphql-ruby.org/errors/execution_errors
60
+ return graphql_errors.map { |e| e['message'] }.join(', ') if graphql_errors.present?
56
61
  return errors.map { |e| "#{e['title']} (#{e['detail']})" }.join(', ') if errors.present?
57
62
 
58
63
  ResponseErrorFormatter.format(response: @response, object_identifier: @object_identifier)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dor-services-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.16.0
4
+ version: 12.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-09-11 00:00:00.000000000 Z
12
+ date: 2023-09-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport