dina 1.2.0.0 → 1.3.0.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: 3e1d7ef84d82908a0cfa2bacbf9b71dc311ec9a255b8a3598d292cd0997ef9e5
4
- data.tar.gz: c2982683e2b041eae5b1978de2dbc4d72feaae334e67650168e31a430de9a7c7
3
+ metadata.gz: 36ae9a46adaaf1a545511c102afbc5bada1c3ad4632273672253f9191e347459
4
+ data.tar.gz: 67c1631fad9d7ebb3469a063fc6b22e1d6c9d720a8abe6804ae35c7d4dd83848
5
5
  SHA512:
6
- metadata.gz: 8c0228419cb5b4cd6754e5de928198d346f13c11a2b7a589814c2be08e152e0cc1bd93de724fd9a9641e2eb9616f6b9a3e871ec1d15fc96aad12a64c28ba172d
7
- data.tar.gz: 80396b5d6e83c16c7dff385d21b94ef9c86981e1b14f93b741b0c6501d9f38f6b9f1b8619883341420375568dbe58253b95c668416db3b0ac556da5d6bd79469
6
+ metadata.gz: ba219ae94560f594838864568429f8c84e4bf86a8c4396a0fd142c8803a0aea03f0da864b7bb9b44f700234d1da7dfbf9b75e6033ad1690fb5b13e69785700b1
7
+ data.tar.gz: cd564fa3198356107742862c2cc7d45b4c32dace7c3684117ccb9e29d97e066bb0c6fb60dd5ca8aa388afe66c11203fa9d6558efc9f68ee82824536aa076ef4d
@@ -1,49 +1,7 @@
1
- module Dina
2
-
3
- class FileConnection
4
- def initialize(options = {})
5
- site = options.fetch(:site)
6
- connection_options = options.slice(:proxy, :ssl, :request, :headers, :params)
7
- adapter_options = Array(options.fetch(:adapter, Faraday.default_adapter))
8
-
9
- @faraday = Faraday.new(site, connection_options) do |builder|
10
- builder.request :multipart
11
- builder.use ::JsonApiClient::Middleware::ParseJson
12
- builder.adapter(*adapter_options)
13
- end
14
- yield(self) if block_given?
15
- end
1
+ require_rel '../base_model'
2
+ require_rel 'file_connection'
16
3
 
17
- def run(request_method, path, params: nil, headers: {}, body: nil)
18
- path = path + "/#{body[:data]["attributes"]["group"].downcase}"
19
- if body[:data]["attributes"].key?("is_derivative")
20
- path = path + "/derivative"
21
- end
22
- file_path = body[:data]["attributes"]["filePath"]
23
- mime_type = body[:data]["attributes"]["dcFormat"]
24
- file_name = body[:data]["attributes"]["fileName"]
25
-
26
- body[:file] = Faraday::Multipart::FilePart.new(
27
- file_path,
28
- mime_type,
29
- file_name
30
- )
31
-
32
- response = @faraday.run_request(request_method, path, body, headers) do |request|
33
- request.params.update(params) if params
34
- end
35
- attributes = response.body.dup
36
- response.body["meta"] = {}
37
- response.body["errors"] = []
38
- response.body["data"] = {
39
- "id" => attributes["uuid"],
40
- "type" => "file",
41
- "relationships" => {},
42
- "attributes" => attributes
43
- }
44
- response
45
- end
46
- end
4
+ module Dina
47
5
 
48
6
  class File < BaseModel
49
7
  property :id, type: :string, default: SecureRandom.uuid
@@ -0,0 +1,50 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+
5
+ class FileConnection
6
+ def initialize(options = {})
7
+ site = options.fetch(:site)
8
+ connection_options = options.slice(:proxy, :ssl, :request, :headers, :params)
9
+ adapter_options = Array(options.fetch(:adapter, Faraday.default_adapter))
10
+
11
+ @faraday = Faraday.new(site, connection_options) do |builder|
12
+ builder.request :multipart
13
+ builder.use ::JsonApiClient::Middleware::ParseJson
14
+ builder.adapter(*adapter_options)
15
+ end
16
+ yield(self) if block_given?
17
+ end
18
+
19
+ def run(request_method, path, params: nil, headers: {}, body: nil)
20
+ path = path + "/#{body[:data]["attributes"]["group"].downcase}"
21
+ if body[:data]["attributes"].key?("is_derivative")
22
+ path = path + "/derivative"
23
+ end
24
+ file_path = body[:data]["attributes"]["filePath"]
25
+ mime_type = body[:data]["attributes"]["dcFormat"]
26
+ file_name = body[:data]["attributes"]["fileName"]
27
+
28
+ body[:file] = Faraday::Multipart::FilePart.new(
29
+ file_path,
30
+ mime_type,
31
+ file_name
32
+ )
33
+
34
+ response = @faraday.run_request(request_method, path, body, headers) do |request|
35
+ request.params.update(params) if params
36
+ end
37
+ attributes = response.body.dup
38
+ response.body["meta"] = {}
39
+ response.body["errors"] = []
40
+ response.body["data"] = {
41
+ "id" => attributes["uuid"],
42
+ "type" => "file",
43
+ "relationships" => {},
44
+ "attributes" => attributes
45
+ }
46
+ response
47
+ end
48
+ end
49
+
50
+ end
@@ -1,25 +1,20 @@
1
- require_rel 'base_search'
1
+ require_rel '../models/base_model'
2
+ require_rel 'search_connection'
2
3
 
3
4
  module Dina
4
- class Search < BaseSearch
5
+ class Search < BaseModel
6
+
7
+ self.connection_class = SearchConnection
8
+
9
+ custom_endpoint :execute, on: :collection, request_method: :post
5
10
 
6
11
  def self.endpoint_path
7
- "search-api/search-ws/search"
12
+ "search-api/search-ws/"
8
13
  end
9
14
 
10
- # Executes a search
11
- #
12
- # @param index [String] the index, accepted value is one of "agent", "material_sample", "object_store"
13
- # @param payload [Hash] the payload hash as an Elasticsearch-formatted body
14
- # => { query: { match_all: {} }
15
- #
16
- # @return [Hash] the search result with symbolized keys
17
- def self.execute(index:, payload: { query: { match_all: {} } })
18
- params = {
19
- indexName: index_name(index: index)
20
- }
21
- super(params.compact, method: :post, payload: payload)[:hits]
15
+ def self.table_name
16
+ "search"
22
17
  end
23
18
 
24
19
  end
25
- end
20
+ end
@@ -1,34 +1,22 @@
1
- require_rel 'base_search'
1
+ require_rel '../models/base_model'
2
+ require_rel 'search_connection'
3
+
4
+ #TODO: requires testing, likely failing
2
5
 
3
6
  module Dina
4
- class SearchAutocomplete < BaseSearch
7
+ class SearchAutocomplete < BaseModel
8
+
9
+ self.connection_class = SearchConnection
10
+
11
+ custom_endpoint :execute, on: :collection, request_method: :post
5
12
 
6
13
  def self.endpoint_path
7
- "search-api/search-ws/auto-complete"
14
+ "search-api/search-ws/"
8
15
  end
9
16
 
10
- # Executes an autocomplete search
11
- #
12
- # Known field values (dependent on chosen index):
13
- # agent: data.attributes.displayName
14
- # material_sample: included.attributes.dwcRecordedBy, included.attributes.verbatimDeterminer
15
- # object_store: none
16
- #
17
- # @param term [String] the search term
18
- # @param index [String] the index, accepted value is one of "agent", "material_sample", "object_store"
19
- # @param field [String]
20
- # @param group [String] the DINA group name
21
- #
22
- # @return [Hash] the search result with symbolized keys
23
- def self.execute(term:, index:, field: nil, group: nil)
24
- params = {
25
- prefix: term,
26
- indexName: index_name(index: index),
27
- autoCompleteField: field,
28
- group: group
29
- }
30
- super(params.compact)[:hits]
17
+ def self.table_name
18
+ "auto-complete"
31
19
  end
32
20
 
33
21
  end
34
- end
22
+ end
@@ -0,0 +1,64 @@
1
+ require_rel '../models/base_model'
2
+
3
+ module Dina
4
+
5
+ class SearchConnection
6
+
7
+ attr_reader :faraday
8
+
9
+ def initialize(options = {})
10
+ site = options.fetch(:site)
11
+ connection_options = options.slice(:proxy, :ssl, :request, :headers, :params)
12
+ adapter_options = Array(options.fetch(:adapter, Faraday.default_adapter))
13
+
14
+ @faraday = Faraday.new(site, connection_options) do |builder|
15
+ builder.request :json
16
+ builder.use ::JsonApiClient::Middleware::ParseJson
17
+ builder.adapter(*adapter_options)
18
+ end
19
+ yield(self) if block_given?
20
+ end
21
+
22
+ # Sets the search index name
23
+ #
24
+ # @param index [String] the search index; options are "agent", "material_sample", "object_store"
25
+ #
26
+ # @return [String] the internally-recognized search index name
27
+ def index_name(index:)
28
+ return nil if !index
29
+ "dina_#{index}_index"
30
+ end
31
+
32
+ def custom_headers
33
+ { content_type: "application/json", authorization: Dina.header }
34
+ end
35
+
36
+ def run(request_method, path, params: nil, headers: {}, body: nil)
37
+ #TODO: works for search class, but likely failing for autocomplete, count, and mapping
38
+ params = {
39
+ indexName: index_name(index: body[:index])
40
+ }
41
+ path.slice!("/execute")
42
+ payload = JSON.generate(body[:payload]) rescue ""
43
+
44
+ response = faraday.run_request(request_method, path, body, headers) do |request|
45
+ request.params.update(params) if params
46
+ request.headers = custom_headers
47
+ request.body = payload
48
+ end
49
+
50
+ attributes = response.body.dup
51
+ response.body["meta"] = {}
52
+ response.body["errors"] = []
53
+ response.body["data"] = attributes["hits"]["hits"].map{|d| d["_source"]["data"]} rescue []
54
+ response
55
+ end
56
+
57
+ def use(middleware, *args, &block)
58
+ return if faraday.builder.locked?
59
+ faraday.builder.insert_before(Middleware::ParseJson, middleware, *args, &block)
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -1,25 +1,22 @@
1
- require_rel 'base_search'
1
+ require_rel '../models/base_model'
2
+ require_rel 'search_connection'
3
+
4
+ #TODO: requires testing, likely failing
2
5
 
3
6
  module Dina
4
- class SearchCount < BaseSearch
7
+ class SearchCount < BaseModel
8
+
9
+ self.connection_class = SearchConnection
10
+
11
+ custom_endpoint :execute, on: :collection, request_method: :post
5
12
 
6
13
  def self.endpoint_path
7
- "search-api/search-ws/count"
14
+ "search-api/search-ws/"
8
15
  end
9
16
 
10
- # Executes an count search
11
- #
12
- # @param index [String] the index, accepted value is one of "agent", "material_sample", "object_store"
13
- # @param payload [Hash] the Elasticsearch query hash
14
- # => Example: {query: {bool: {filter: {term: {"data.attributes.group": "dao"}}}}}
15
- #
16
- # @return [Integer] the count of items in the index according to the query/filter
17
- def self.execute(index:, payload: { query: { match_all: {} }})
18
- params = {
19
- indexName: index_name(index: index)
20
- }
21
- super(params.compact, method: :post, payload: payload)[:count]
17
+ def self.table_name
18
+ "count"
22
19
  end
23
20
 
24
21
  end
25
- end
22
+ end
@@ -1,22 +1,21 @@
1
- require_rel 'base_search'
1
+ require_rel '../models/base_model'
2
+ require_rel 'search_connection'
3
+
4
+ #TODO: requires testing, likely failing
2
5
 
3
6
  module Dina
4
- class SearchMapping < BaseSearch
7
+ class SearchMapping < BaseModel
8
+
9
+ self.connection_class = SearchConnection
10
+
11
+ custom_endpoint :execute, on: :collection, request_method: :get
5
12
 
6
13
  def self.endpoint_path
7
- "search-api/search-ws/mapping"
14
+ "search-api/search-ws/"
8
15
  end
9
16
 
10
- # Return the search mapping document
11
- #
12
- # @param index [String] the index, accepted value is one of "agent", "material_sample", "object_store"
13
- #
14
- # @return [Hash] the mapping document as a hash with symbolized keys
15
- def self.execute(index:)
16
- params = {
17
- indexName: index_name(index: index)
18
- }
19
- super(params.compact)
17
+ def self.table_name
18
+ "mapping"
20
19
  end
21
20
 
22
21
  end
data/lib/dina/version.rb CHANGED
@@ -2,7 +2,7 @@ module Dina
2
2
  class Version
3
3
 
4
4
  MAJOR = 1
5
- MINOR = 2
5
+ MINOR = 3
6
6
  PATCH = 0
7
7
  BUILD = 0
8
8
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dina
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0.0
4
+ version: 1.3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David P. Shorthouse
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-11-28 00:00:00.000000000 Z
12
+ date: 2023-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json_api_client
@@ -67,20 +67,6 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: 3.0.0
70
- - !ruby/object:Gem::Dependency
71
- name: rest-client
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: 2.1.0
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - "~>"
82
- - !ruby/object:Gem::Version
83
- version: 2.1.0
84
70
  - !ruby/object:Gem::Dependency
85
71
  name: faraday-multipart
86
72
  requirement: !ruby/object:Gem::Requirement
@@ -198,6 +184,7 @@ files:
198
184
  - lib/dina/models/material_sample/protocol.rb
199
185
  - lib/dina/models/object_store/derivative.rb
200
186
  - lib/dina/models/object_store/file.rb
187
+ - lib/dina/models/object_store/file_connection.rb
201
188
  - lib/dina/models/object_store/object_store.rb
202
189
  - lib/dina/models/object_store/object_store_managed_attribute.rb
203
190
  - lib/dina/models/object_store/object_subtype.rb
@@ -213,9 +200,9 @@ files:
213
200
  - lib/dina/models/storage/storage_unit_type.rb
214
201
  - lib/dina/models/transaction/transaction.rb
215
202
  - lib/dina/models/user.rb
216
- - lib/dina/search/base_search.rb
217
203
  - lib/dina/search/search.rb
218
204
  - lib/dina/search/search_autocomplete.rb
205
+ - lib/dina/search/search_connection.rb
219
206
  - lib/dina/search/search_count.rb
220
207
  - lib/dina/search/search_mapping.rb
221
208
  - lib/dina/utils/identifier.rb
@@ -1,57 +0,0 @@
1
- module Dina
2
- class BaseSearch < BaseModel
3
-
4
- def self.verify_ssl
5
- begin
6
- connection_options[:ssl][:verify]
7
- rescue
8
- true
9
- end
10
- end
11
-
12
- def self.endpoint
13
- Dina.config.endpoint_url
14
- end
15
-
16
- def self.endpoint_path
17
- "search-api/search-ws/"
18
- end
19
-
20
- # Sets the search index name
21
- #
22
- # @param index [String] the search index; options are "agent", "material_sample", "object_store"
23
- #
24
- # @return [String] the internally-recognized search index name
25
- def self.index_name(index:)
26
- return nil if !index
27
- "dina_#{index}_index"
28
- end
29
-
30
- # Executes a search
31
- #
32
- # @param params [Hash] the parameters to be included in the endpoint URL
33
- # @param method [Symbol] the request type as :get or :post
34
- # @param payload [Hash] the elasticsearch query
35
- #
36
- # @return [Hash] the search response with symbolized keys
37
- def self.execute(params, method: :get, payload: {})
38
- begin
39
- response = RestClient::Request.execute(
40
- method: method,
41
- url: endpoint + "/" + endpoint_path + "?" + params.to_query,
42
- payload: payload.to_json,
43
- headers: {
44
- accept: 'application/json',
45
- content_type: 'application/json',
46
- authorization: Dina.header
47
- },
48
- verify_ssl: verify_ssl
49
- )
50
- JSON.parse(response, symbolize_names: true)
51
- rescue RestClient::ExceptionWithResponse => e
52
- e.response
53
- end
54
- end
55
-
56
- end
57
- end