dina 0.4.0.0 → 0.4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dina/json_api_client_patch.rb +11 -0
  3. data/lib/dina/models/{identifier.rb → agent/identifier.rb} +3 -1
  4. data/lib/dina/models/{organization.rb → agent/organization.rb} +1 -1
  5. data/lib/dina/models/{person.rb → agent/person.rb} +21 -1
  6. data/lib/dina/models/{collecting_event.rb → material_sample/collecting_event.rb} +1 -1
  7. data/lib/dina/models/{collecting_method.rb → material_sample/collecting_method.rb} +1 -1
  8. data/lib/dina/models/{collection.rb → material_sample/collection.rb} +1 -1
  9. data/lib/dina/models/{collection_sequence_generator.rb → material_sample/collection_sequence_generator.rb} +1 -1
  10. data/lib/dina/models/{material_sample.rb → material_sample/material_sample.rb} +1 -1
  11. data/lib/dina/models/{organism.rb → material_sample/organism.rb} +1 -1
  12. data/lib/dina/models/{preparation_method.rb → material_sample/preparation_method.rb} +1 -1
  13. data/lib/dina/models/{preparation_type.rb → material_sample/preparation_type.rb} +1 -1
  14. data/lib/dina/models/{project.rb → material_sample/project.rb} +1 -1
  15. data/lib/dina/models/{protocol.rb → material_sample/protocol.rb} +1 -1
  16. data/lib/dina/models/{derivative.rb → object_store/derivative.rb} +1 -1
  17. data/lib/dina/models/{file.rb → object_store/file.rb} +0 -0
  18. data/lib/dina/models/{object_store.rb → object_store/object_store.rb} +1 -1
  19. data/lib/dina/models/{object_store_managed_attribute.rb → object_store/object_store_managed_attribute.rb} +1 -1
  20. data/lib/dina/models/{object_subtype.rb → object_store/object_subtype.rb} +1 -1
  21. data/lib/dina/models/sequence/index_set.rb +19 -0
  22. data/lib/dina/models/sequence/molecular_sample.rb +19 -0
  23. data/lib/dina/models/sequence/ngs_workflow.rb +19 -0
  24. data/lib/dina/models/sequence/pcr_batch.rb +19 -0
  25. data/lib/dina/models/sequence/pcr_primer.rb +19 -0
  26. data/lib/dina/models/sequence/product.rb +19 -0
  27. data/lib/dina/models/sequence/region.rb +19 -0
  28. data/lib/dina/models/sequence/thermocycler_profile.rb +19 -0
  29. data/lib/dina/models/{storage_unit.rb → storage/storage_unit.rb} +1 -1
  30. data/lib/dina/models/{storage_unit_type.rb → storage/storage_unit_type.rb} +1 -1
  31. data/lib/dina/models/{transaction.rb → transaction/transaction.rb} +1 -1
  32. data/lib/dina/search/base_search.rb +22 -6
  33. data/lib/dina/search/search.rb +7 -2
  34. data/lib/dina/search/search_autocomplete.rb +10 -2
  35. data/lib/dina/search/search_count.rb +8 -3
  36. data/lib/dina/search/search_mapping.rb +5 -1
  37. data/lib/dina/version.rb +1 -1
  38. metadata +46 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4cae0ee74ed1a0967bb360af211c2ab37676dfdb39b54a377ec39b539e0f4301
4
- data.tar.gz: 45ee9d1cda7f37da9fb5384690751dac5e5cc0fe30153cddf8306e11a20f7151
3
+ metadata.gz: 868b096ec196f62ae6cf4507cadf08c277b26f462957873140abc93ecf88a1a6
4
+ data.tar.gz: 26c127ec2bf4e6e9c990b4361aff69d1ce9f6a5e578ae01065472e8ede524bf5
5
5
  SHA512:
6
- metadata.gz: 60a62ece7262ab086b88002497bd55f1ea04059b94468134b7c93d35a3349deff0c3ed58c45f634dd07a3149e4895da1525c215aef1895258beb62cf5af0aba5
7
- data.tar.gz: dba63bace34688530c56cb56af702af39fe36bcb7ba86bf664b1192a7186ca51207ef9cef2deed311993671127772deb4f149f99fd90619ad56408dc379882a7
6
+ metadata.gz: 9fcd3ceca0594b95caaea14870a0ff6ebc9284fab58eac5e98bd236c04e8235b4fb542c720cba9c394b63b719a4883642f82e0871b347a9a18c5225c8e42e5b6
7
+ data.tar.gz: 95d262c72d8955a9eb944886efcd0784af500f4f8235846bc062a69d5128652e0af0260d85f7243bd608e8d2bd3f895a309cc752baac6b742282f84db658f88e
@@ -0,0 +1,11 @@
1
+ # Monkeypatch the data method because the relations urls in the DINA JSON:API spec are incorrectly formed through its frontend proxy
2
+ module JsonApiClient
3
+ module Associations
4
+ class BaseAssociation
5
+ def data(url)
6
+ url.sub!("/api/v1/", "/api/#{association_class.requestor.instance_variable_get(:@klass).endpoint_path}")
7
+ from_result_set(association_class.requestor.linked(url))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Identifier < BaseModel
@@ -8,6 +8,8 @@ module Dina
8
8
  property :createdBy, type: :string
9
9
  property :createdOn, type: :time
10
10
 
11
+ belongs_to :person, shallow_path: true, class_name: "Person"
12
+
11
13
  def self.endpoint_path
12
14
  "agent-api/"
13
15
  end
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Organization < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Person < BaseModel
@@ -35,6 +35,26 @@ module Dina
35
35
  where("email": email).all
36
36
  end
37
37
 
38
+ def self.search_by_name(name)
39
+ payload = {
40
+ query: {
41
+ multi_match: {
42
+ query: name,
43
+ type: :cross_fields,
44
+ fields: [
45
+ "data.attributes.familyNames^3",
46
+ "data.attributes.givenNames",
47
+ "data.attributes.displayName^5",
48
+ "data.attributes.aliases",
49
+ "data.attributes.displayName.autocomplete"
50
+ ]
51
+ }
52
+ }
53
+ }
54
+ hits = Dina::Search.execute(index: "agent", payload: payload)[:hits]
55
+ hits.map{|a| self.find(a[:_source][:data][:id]).first }
56
+ end
57
+
38
58
  private
39
59
 
40
60
  def on_before_save
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class CollectingEvent < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class CollectingMethod < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Collection < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class CollectionSequenceGenerator < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class MaterialSample < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Organism < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class PreparationMethod < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class PreparationType < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Project < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Protocol < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Derivative < BaseModel
File without changes
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class ObjectStore < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class ObjectStoreManagedAttribute < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class ObjectSubtype < BaseModel
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class IndexSet < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "index-set"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class MolecularSample < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "molecular-sample"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class NgsWorkflow < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "chain"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class PcrBatch < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "pcr-batch"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class PcrPrimer < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "pcr-primer"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class Product < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "product"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class Region < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "region"
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_rel '../base_model'
2
+
3
+ module Dina
4
+ class ThermocyclerProfile < BaseModel
5
+ property :id, type: :string, default: SecureRandom.uuid
6
+ property :group, type: :string
7
+
8
+ validates_presence_of :group, message: "group is required"
9
+
10
+ def self.endpoint_path
11
+ "seqdb-api/"
12
+ end
13
+
14
+ def self.table_name
15
+ "thermocycler-profile"
16
+ end
17
+
18
+ end
19
+ end
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class StorageUnit < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class StorageUnitType < BaseModel
@@ -1,4 +1,4 @@
1
- require_rel 'base_model'
1
+ require_rel '../base_model'
2
2
 
3
3
  module Dina
4
4
  class Transaction < BaseModel
@@ -2,26 +2,42 @@ module Dina
2
2
  class BaseSearch
3
3
 
4
4
  def self.endpoint
5
- Settings.server.endpoint
5
+ Dina::Authentication.endpoint_url
6
6
  end
7
7
 
8
8
  def self.endpoint_path
9
9
  "search-api/search-ws/"
10
10
  end
11
11
 
12
+ # Sets the search index name
13
+ #
14
+ # @param index [String] the search index; options are "agent", "material_sample", "object_store"
15
+ #
16
+ # @return [String] the internally-recognized search index name
12
17
  def self.index_name(index:)
13
18
  return nil if !index
14
19
  "dina_#{index}_index"
15
20
  end
16
21
 
22
+ # Executes a search
23
+ #
24
+ # @param params [Hash] the parameters to be included in the endpoint URL
25
+ # @param method [Symbol] the request type as :get or :post
26
+ # @param payload [Hash] the elasticsearch query
27
+ #
28
+ # @return [Hash] the search response with symbolized keys
17
29
  def self.execute(params, method: :get, payload: {})
18
30
  begin
19
31
  response = RestClient::Request.execute(
20
- method: method,
21
- url: endpoint + endpoint_path + "?" + params.to_query,
22
- payload: payload.to_json,
23
- headers: { accept: 'application/json', content_type: 'application/json' }
24
- )
32
+ method: method,
33
+ url: endpoint + endpoint_path + "?" + params.to_query,
34
+ payload: payload.to_json,
35
+ headers: {
36
+ accept: 'application/json',
37
+ content_type: 'application/json',
38
+ authorization: Dina::Authentication.header
39
+ }
40
+ )
25
41
  JSON.parse(response, symbolize_names: true)
26
42
  rescue RestClient::ExceptionWithResponse => e
27
43
  e.response
@@ -7,8 +7,13 @@ module Dina
7
7
  "search-api/search-ws/search"
8
8
  end
9
9
 
10
- # index values: "agent", "material_sample", "object_store"
11
- # payload is a hash in the form of an Elasticsearch body
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
12
17
  def self.execute(index:, payload: { query: { match_all: {} } })
13
18
  params = {
14
19
  indexName: index_name(index: index)
@@ -7,11 +7,19 @@ module Dina
7
7
  "search-api/search-ws/auto-complete"
8
8
  end
9
9
 
10
- # index values: "agent", "material_sample", "object_store"
11
- # known autocomplete fields:
10
+ # Executes an autocomplete search
11
+ #
12
+ # Known field values (dependent on chosen index):
12
13
  # agent: data.attributes.displayName
13
14
  # material_sample: included.attributes.dwcRecordedBy, included.attributes.verbatimDeterminer
14
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
15
23
  def self.execute(term:, index:, field: nil, group: nil)
16
24
  params = {
17
25
  prefix: term,
@@ -7,9 +7,14 @@ module Dina
7
7
  "search-api/search-ws/count"
8
8
  end
9
9
 
10
- # index values: "agent", "material_sample", "object_store"
11
- # Payload is a has like: {query: {bool: {filter: {term: {"data.attributes.group": "dao"}}}}}
12
- def self.execute(index:, payload: {})
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: {} }})
13
18
  params = {
14
19
  indexName: index_name(index: index)
15
20
  }
@@ -7,7 +7,11 @@ module Dina
7
7
  "search-api/search-ws/mapping"
8
8
  end
9
9
 
10
- # index values: "agent", "material_sample", "object_store"
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
11
15
  def self.execute(index:)
12
16
  params = {
13
17
  indexName: index_name(index: index)
data/lib/dina/version.rb CHANGED
@@ -3,7 +3,7 @@ module Dina
3
3
 
4
4
  MAJOR = 0
5
5
  MINOR = 4
6
- PATCH = 0
6
+ PATCH = 2
7
7
  BUILD = 0
8
8
 
9
9
  def self.version
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dina
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0.0
4
+ version: 0.4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David P. Shorthouse
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-30 00:00:00.000000000 Z
11
+ date: 2022-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json_api_client
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 3.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rest-client
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.1.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.1.0
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -141,33 +155,42 @@ files:
141
155
  - lib/dina/components/georeference_assertion.rb
142
156
  - lib/dina/components/shipment.rb
143
157
  - lib/dina/exceptions.rb
158
+ - lib/dina/json_api_client_patch.rb
144
159
  - lib/dina/models/acquisition_event.rb
160
+ - lib/dina/models/agent/identifier.rb
161
+ - lib/dina/models/agent/organization.rb
162
+ - lib/dina/models/agent/person.rb
145
163
  - lib/dina/models/assemblage.rb
146
164
  - lib/dina/models/attachment.rb
147
165
  - lib/dina/models/base_model.rb
148
- - lib/dina/models/collecting_event.rb
149
- - lib/dina/models/collecting_method.rb
150
- - lib/dina/models/collection.rb
151
- - lib/dina/models/collection_sequence_generator.rb
152
- - lib/dina/models/derivative.rb
153
- - lib/dina/models/file.rb
154
- - lib/dina/models/identifier.rb
155
166
  - lib/dina/models/institution.rb
156
167
  - lib/dina/models/managed_attribute.rb
157
- - lib/dina/models/material_sample.rb
158
- - lib/dina/models/object_store.rb
159
- - lib/dina/models/object_store_managed_attribute.rb
160
- - lib/dina/models/object_subtype.rb
161
- - lib/dina/models/organism.rb
162
- - lib/dina/models/organization.rb
163
- - lib/dina/models/person.rb
164
- - lib/dina/models/preparation_method.rb
165
- - lib/dina/models/preparation_type.rb
166
- - lib/dina/models/project.rb
167
- - lib/dina/models/protocol.rb
168
- - lib/dina/models/storage_unit.rb
169
- - lib/dina/models/storage_unit_type.rb
170
- - lib/dina/models/transaction.rb
168
+ - lib/dina/models/material_sample/collecting_event.rb
169
+ - lib/dina/models/material_sample/collecting_method.rb
170
+ - lib/dina/models/material_sample/collection.rb
171
+ - lib/dina/models/material_sample/collection_sequence_generator.rb
172
+ - lib/dina/models/material_sample/material_sample.rb
173
+ - lib/dina/models/material_sample/organism.rb
174
+ - lib/dina/models/material_sample/preparation_method.rb
175
+ - lib/dina/models/material_sample/preparation_type.rb
176
+ - lib/dina/models/material_sample/project.rb
177
+ - lib/dina/models/material_sample/protocol.rb
178
+ - lib/dina/models/object_store/derivative.rb
179
+ - lib/dina/models/object_store/file.rb
180
+ - lib/dina/models/object_store/object_store.rb
181
+ - lib/dina/models/object_store/object_store_managed_attribute.rb
182
+ - lib/dina/models/object_store/object_subtype.rb
183
+ - lib/dina/models/sequence/index_set.rb
184
+ - lib/dina/models/sequence/molecular_sample.rb
185
+ - lib/dina/models/sequence/ngs_workflow.rb
186
+ - lib/dina/models/sequence/pcr_batch.rb
187
+ - lib/dina/models/sequence/pcr_primer.rb
188
+ - lib/dina/models/sequence/product.rb
189
+ - lib/dina/models/sequence/region.rb
190
+ - lib/dina/models/sequence/thermocycler_profile.rb
191
+ - lib/dina/models/storage/storage_unit.rb
192
+ - lib/dina/models/storage/storage_unit_type.rb
193
+ - lib/dina/models/transaction/transaction.rb
171
194
  - lib/dina/models/user.rb
172
195
  - lib/dina/search/base_search.rb
173
196
  - lib/dina/search/search.rb