dor-services 7.2.4 → 8.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/config/config_defaults.yml +24 -41
  3. data/config/dev_console_env.rb.example +0 -9
  4. data/lib/dor-services.rb +6 -9
  5. data/lib/dor/config.rb +2 -126
  6. data/lib/dor/datastreams/content_metadata_ds.rb +7 -0
  7. data/lib/dor/datastreams/embargo_metadata_ds.rb +1 -1
  8. data/lib/dor/datastreams/role_metadata_ds.rb +1 -1
  9. data/lib/dor/datastreams/workflow_definition_ds.rb +0 -22
  10. data/lib/dor/datastreams/workflow_ds.rb +2 -64
  11. data/lib/dor/indexers/workflows_indexer.rb +7 -1
  12. data/lib/dor/models/abstract.rb +2 -4
  13. data/lib/dor/models/workflow_object.rb +0 -46
  14. data/lib/dor/release_tags.rb +13 -0
  15. data/lib/dor/release_tags/identity_metadata.rb +202 -0
  16. data/lib/dor/release_tags/purl.rb +50 -0
  17. data/lib/dor/release_tags/purl_client.rb +44 -0
  18. data/lib/dor/services/release_tag_service.rb +9 -179
  19. data/lib/dor/services/state_service.rb +23 -0
  20. data/lib/dor/static_config.rb +108 -0
  21. data/lib/dor/static_config/fedora_config.rb +36 -0
  22. data/lib/dor/static_config/solr_config.rb +21 -0
  23. data/lib/dor/static_config/ssl_config.rb +33 -0
  24. data/lib/dor/static_config/stacks_config.rb +39 -0
  25. data/lib/dor/static_config/suri_config.rb +45 -0
  26. data/lib/dor/static_config/workflow_config.rb +51 -0
  27. data/lib/dor/version.rb +1 -1
  28. data/lib/dor/workflow/document.rb +0 -10
  29. metadata +26 -66
  30. data/lib/dor/services/cleanup_service.rb +0 -63
  31. data/lib/dor/services/create_workflow_service.rb +0 -53
  32. data/lib/dor/services/delete_service.rb +0 -60
  33. data/lib/dor/services/metadata_handlers/catalog_handler.rb +0 -27
  34. data/lib/dor/services/metadata_service.rb +0 -64
  35. data/lib/dor/services/mods2dc.xslt +0 -474
  36. data/lib/dor/services/public_desc_metadata_service.rb +0 -184
  37. data/lib/dor/services/purl_client.rb +0 -42
  38. data/lib/dor/services/thumbnail_service.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 57815dc1bd6975e0c465e24baa1c7dbe62ad7b1a9e981d33e0c5eef6a17760db
4
- data.tar.gz: 063fb43bd5f584359cf71bccca0013bfa40621a1571b2866efa1b8cbbae7d336
3
+ metadata.gz: 2b23b30fbc918705e040049d04869e4ce0ca5d2c9060aa52cbc3cb17bcbf1efa
4
+ data.tar.gz: 75f7b272d2bd43b5cc6546f9881f15cd3f85f484bc5a219c710ac428efb8a558
5
5
  SHA512:
6
- metadata.gz: cb972848b34b46f78aafbeb4cd250406a989f3563b0d0ea3ae630aa1b64de9afd19e68d1ec664f64aea68d35d5a56ddda2db2e87d42ce636174dfd6da6e7e888
7
- data.tar.gz: 134334347411b72274708334175656d887d564463176a884d07e546bcbd7750a271c72635ee18ab827b7cd4e89456cefbd12c1b95e5e3ff978b957e80d59a85f
6
+ metadata.gz: f0fb8fe1755b93d8257f74b17ebc822e287dbb9d69c2a2376b05b6a45bc0f7241f68d8ffb0b36b0294e42b5030af223e9660e48c116e6c86882cc88f25e1589c
7
+ data.tar.gz: 4de638d794ec9b372f3093c5ee432067c9ebca4fc213b7d4793a77f29b9d6bbde92cdf180e0f00844ac6cea89ed048639a2817e67f38743f21d03d199c74c327
@@ -1,42 +1,25 @@
1
1
  ---
2
- :cleanup:
3
- :local_workspace_root: /dor/workspace
4
- :local_assembly_root: /dor/assembly
5
- :local_export_home: /dor/export
6
- :ssl:
7
- :cert_file:
8
- :key_file:
9
- :key_pass: ""
10
- :fedora:
11
- :url:
12
- :solr:
13
- :url:
14
- :opts: {}
15
- :metadata:
16
- :catalog:
17
- :url:
18
- :user:
19
- :pass:
20
- :stacks:
21
- :local_workspace_root: /dor
22
- :host:
23
- :user:
24
- :document_cache_host:
25
- :document_cache_user:
26
- :local_stacks_root: /stacks
27
- :local_document_cache_root: /purl/document_cache
28
- :url:
29
- :iiif_profile: 'http://iiif.io/api/image/2/level1.json'
30
- :suri:
31
- :pass:
32
- :id_namespace: druid
33
- :url:
34
- :user:
35
- :mint_ids: false
36
- :workflow:
37
- :url:
38
- :timeout: 60
39
- :logfile: workflow_service.log
40
- :shift_age: weekly
41
- :dor_services:
42
- :url:
2
+ ssl:
3
+ cert_file:
4
+ key_file:
5
+ key_pass: ""
6
+ fedora:
7
+ url:
8
+ solr:
9
+ url:
10
+ stacks:
11
+ local_workspace_root: /dor
12
+ document_cache_host:
13
+ local_stacks_root: /stacks
14
+ local_document_cache_root: /purl/document_cache
15
+ suri:
16
+ pass:
17
+ id_namespace: druid
18
+ url:
19
+ user:
20
+ mint_ids: false
21
+ workflow:
22
+ url:
23
+ timeout: 60
24
+ logfile: workflow_service.log
25
+ shift_age: weekly
@@ -21,24 +21,15 @@ Dor::Config.configure do
21
21
  pass ''
22
22
  end
23
23
 
24
- metadata do
25
- exist.url 'http://server/exist/rest/'
26
- catalog.url 'http://lyberservices-prod.stanford.edu/catalog/mods'
27
- end
28
-
29
24
  stacks do
30
25
  document_cache_host 'purl-dev.stanford.edu'
31
- document_cache_user ''
32
26
  local_workspace_root '/dor/workspace'
33
- host 'host'
34
- user ''
35
27
  local_stacks_root '/stacks'
36
28
  local_document_cache_root '/purl'
37
29
  end
38
30
 
39
31
  solr.url 'https://host/solr'
40
32
  workflow.url 'https://workflow.example.edu/'
41
- dor_services.url 'https://host/dor/v1'
42
33
 
43
34
  cleanup do
44
35
  local_workspace_root '/dor/workspace'
@@ -36,6 +36,7 @@ module Dor
36
36
  end
37
37
 
38
38
  require 'dor/version'
39
+ require 'dor/static_config'
39
40
  require 'dor/config'
40
41
  require 'dor/exceptions'
41
42
 
@@ -87,6 +88,8 @@ module Dor
87
88
  end
88
89
 
89
90
  eager_autoload do
91
+ autoload :ReleaseTags
92
+
90
93
  # ActiveFedora Classes
91
94
  autoload_under 'models' do
92
95
  autoload :Abstract
@@ -104,25 +107,19 @@ module Dor
104
107
 
105
108
  # Services
106
109
  autoload_under 'services' do
107
- autoload :CleanupService
108
110
  autoload :CollectionService
109
- autoload :CreateWorkflowService
110
111
  autoload :CreativeCommonsLicenseService
111
- autoload :DeleteService
112
112
  autoload :EmbargoService
113
- autoload :IndexingService
114
- autoload :MetadataService
113
+ autoload :IdentityMetadataTagService
115
114
  autoload :Ontology
116
115
  autoload :OpenDataLicenseService
117
- autoload :PublicDescMetadataService
118
- autoload :PublishedRelationshipsFilter
119
- autoload :PurlClient
116
+ autoload :PurlTagService
120
117
  autoload :ReleaseTagService
121
118
  autoload :SearchService
122
119
  autoload :StatusService
120
+ autoload :StateService
123
121
  autoload :SuriService
124
122
  autoload :TagService
125
- autoload :ThumbnailService
126
123
  end
127
124
 
128
125
  # Workflow Classes
@@ -1,133 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'confstruct/configuration'
4
- require 'rsolr'
5
3
  require 'yaml'
6
- require 'dor/certificate_authenticated_rest_resource_factory'
7
- require 'dor/services/client'
8
4
 
9
5
  module Dor
10
- class Configuration < Confstruct::Configuration
11
- include ActiveSupport::Callbacks
12
- define_callbacks :initialize
13
- define_callbacks :configure
14
-
15
- def initialize(*args)
16
- super *args
17
- run_callbacks(:initialize) {}
18
- end
19
-
20
- # Call the super method with callbacks and with $VERBOSE temporarily disabled
21
- def configure(*args)
22
- result = self
23
- temp_verbose = $VERBOSE
24
- $VERBOSE = nil
25
- begin
26
- run_callbacks :configure do
27
- result = super(*args)
28
- end
29
- ensure
30
- $VERBOSE = temp_verbose
31
- end
32
- result
33
- end
34
-
35
- def sanitize
36
- dup
37
- end
38
-
39
- def make_solr_connection(add_opts = {})
40
- opts = Dor::Config.solr.opts.merge(add_opts).merge(
41
- url: Dor::Config.solr.url
42
- )
43
- ::RSolr.connect(opts)
44
- end
45
-
46
- set_callback :initialize, :after do |config|
47
- config.deep_merge!(
48
- fedora: {
49
- client: Confstruct.deferred { |_c| CertificateAuthenticatedRestResourceFactory.create(:fedora) },
50
- safeurl: Confstruct.deferred do |_c|
51
- begin
52
- fedora_uri = URI.parse(config.fedora.url)
53
- fedora_uri.user = fedora_uri.password = nil
54
- fedora_uri.to_s
55
- rescue URI::InvalidURIError
56
- nil
57
- end
58
- end
59
- },
60
- dor_services: {
61
- rest_client: Confstruct.deferred { |_c| RestResourceFactory.create(:dor_services) }
62
- },
63
- purl_services: {
64
- rest_client: Confstruct.deferred { |_c| RestResourceFactory.create(:purl_services) }
65
- },
66
- workflow: {
67
- client: Confstruct.deferred do |c|
68
- @wfs ||= Dor::Workflow::Client.new(url: c.url, logger: c.client_logger, timeout: c.timeout)
69
- end,
70
- client_logger: Confstruct.deferred do |c|
71
- if c.logfile && c.shift_age
72
- Logger.new(c.logfile, c.shift_age)
73
- elsif c.logfile
74
- Logger.new(c.logfile)
75
- end
76
- end
77
- }
78
- )
79
- true
80
- end
81
-
82
- set_callback :configure, :after do |config|
83
- configure_client!(config)
84
-
85
- if config.solr.url.present?
86
- ActiveFedora::SolrService.register
87
- ActiveFedora::SolrService.instance.instance_variable_set :@conn, make_solr_connection
88
- end
89
- end
90
-
91
- def configure_client!(config)
92
- # Do not configure client if URL not specified
93
- return if config.dor_services&.url.blank?
94
-
95
- params = {
96
- url: config.dor_services.url
97
- }
98
- params[:username] = config.dor_services.user if config.dor_services&.user.present?
99
- params[:password] = config.dor_services.pass if config.dor_services&.pass.present?
100
- params[:token] = config.dor_services.token if config.dor_services&.token.present?
101
- params[:token_header] = config.dor_services.token_header if config.dor_services&.token_header.present?
102
-
103
- Dor::Services::Client.configure(params)
104
- end
105
-
106
- # Act like an ActiveFedora.configurator
107
- def init(*args); end
108
-
109
- def fedora_config
110
- fedora_uri = URI.parse(fedora.url)
111
- connection_opts = { url: fedora.safeurl, user: fedora_uri.user, password: fedora_uri.password }
112
- connection_opts[:ssl_client_cert] = OpenSSL::X509::Certificate.new(File.read(ssl.cert_file)) if ssl.cert_file.present?
113
- connection_opts[:ssl_client_key] = OpenSSL::PKey::RSA.new(File.read(ssl.key_file), ssl.key_pass) if ssl.key_file.present?
114
- connection_opts[:ssl_cert_store] = default_ssl_cert_store
115
- connection_opts
116
- end
117
-
118
- def solr_config
119
- { url: solr.url }
120
- end
121
-
122
- def predicate_config
123
- YAML.load(File.read(File.expand_path('../../config/predicate_mappings.yml', __dir__)))
124
- end
125
-
126
- def default_ssl_cert_store
127
- @default_ssl_cert_store ||= RestClient::Request.default_ssl_cert_store
128
- end
129
- end
130
-
131
- Config = Configuration.new(YAML.load(File.read(File.expand_path('../../config/config_defaults.yml', __dir__))))
6
+ defaults = YAML.safe_load(File.read(File.expand_path('../../config/config_defaults.yml', __dir__))).deep_symbolize_keys
7
+ Config = StaticConfig.new(defaults)
132
8
  ActiveFedora.configurator = Config
133
9
  end
@@ -35,6 +35,9 @@ module Dor
35
35
  t.shelved_file_id proxy: %i[resource shelved_file id], index_as: %i[displayable stored_searchable]
36
36
  end
37
37
 
38
+ extend Deprecation
39
+ self.deprecation_horizon = '8.0'
40
+
38
41
  ### READ ONLY METHODS
39
42
 
40
43
  # Only use this when you want the behavior of raising an exception if anything besides exactly one matching node
@@ -165,6 +168,7 @@ module Dor
165
168
  file_node['role'] = file[:role] if file[:role]
166
169
  file_node
167
170
  end
171
+ deprecation_deprecate :add_file
168
172
 
169
173
  # Copies the child's resource into the parent (self) as a virtual resource.
170
174
  # Assumes the resource isn't a duplicate of an existing virtual or real resource.
@@ -231,6 +235,7 @@ module Dor
231
235
  ng_xml.search('//contentMetadata').first.add_child(node)
232
236
  node
233
237
  end
238
+ deprecation_deprecate :add_resource
234
239
 
235
240
  # @param [String] resource_name ID of the resource
236
241
  def remove_resource(resource_name)
@@ -246,12 +251,14 @@ module Dor
246
251
  position += 1
247
252
  end
248
253
  end
254
+ deprecation_deprecate :remove_resource
249
255
 
250
256
  # @param [String] file_name ID of the file element
251
257
  def remove_file(file_name)
252
258
  ng_xml_will_change!
253
259
  ng_xml.search('//file[@id=\'' + file_name + '\']').each(&:remove)
254
260
  end
261
+ deprecation_deprecate :remove_file
255
262
 
256
263
  # @param [String] file_name ID of the file element
257
264
  # @param [String] publish
@@ -31,7 +31,7 @@ module Dor
31
31
  def to_solr(solr_doc = {}, *args)
32
32
  solr_doc = super
33
33
  #::Solrizer.insert_field(solr_doc, field_name, value, *index_types)
34
- rd1 = release_date
34
+ rd1 = release_date
35
35
  rd20 = twenty_pct_release_date
36
36
  ::Solrizer.insert_field(solr_doc, 'embargo_release', rd1.utc.strftime('%FT%TZ'), :dateable) unless rd1.blank?
37
37
  ::Solrizer.insert_field(solr_doc, 'twenty_pct_visibility_release', rd20.utc.strftime('%FT%TZ'), :dateable) unless rd20.blank?
@@ -40,7 +40,7 @@ module Dor
40
40
  val = [actor.at_xpath('identifier/@type'), actor.at_xpath('identifier/text()')].join ':'
41
41
  add_solr_value(solr_doc, "apo_role_#{actor.name}_#{role_type}", val, :string, [:symbol])
42
42
  add_solr_value(solr_doc, "apo_role_#{role_type}", val, :string, [:symbol])
43
- add_solr_value(solr_doc, 'apo_register_permissions', val, :string, %i[symbol stored_searchable]) if ['dor-apo-manager', 'dor-apo-depositor'].include? role_type
43
+ add_solr_value(solr_doc, 'apo_register_permissions', val, :string, %i[symbol stored_searchable]) if %w[dor-apo-manager dor-apo-depositor].include? role_type
44
44
  end
45
45
  solr_doc
46
46
  end
@@ -53,28 +53,6 @@ module Dor
53
53
  ng_xml.at_xpath('/workflow-def/@repository').to_s
54
54
  end
55
55
 
56
- # Creates the xml used by Dor::Workflow::Client#create_workflow
57
- # @return [String] An object's initial workflow as defined by the <workflow-def> in content
58
- def initial_workflow
59
- doc = Nokogiri::XML('<workflow/>')
60
- root = doc.root
61
- root['id'] = name
62
- processes.each do |proc|
63
- doc.create_element 'process' do |node|
64
- node['name'] = proc.name
65
- if proc.status
66
- node['status'] = proc.status
67
- node['attempts'] = '1'
68
- else
69
- node['status'] = 'waiting'
70
- end
71
- node['lifecycle'] = proc.lifecycle if proc.lifecycle
72
- root.add_child node
73
- end
74
- end
75
- Nokogiri::XML(doc.to_xml, &:noblanks).to_xml(&:no_declaration)
76
- end
77
-
78
56
  def to_solr(solr_doc = {}, *args)
79
57
  solr_doc = super(solr_doc, *args)
80
58
  add_solr_value(solr_doc, 'workflow_name', name, :symbol, [:symbol])
@@ -1,23 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dor
4
- # TODO: class docs
5
- class WorkflowDs < ActiveFedora::OmDatastream
4
+ # Represents the datastream that just holds the location of the workflow service
5
+ class WorkflowDs < ActiveFedora::Datastream
6
6
  before_save :build_location
7
- set_terminology do |t|
8
- t.root(path: 'workflows')
9
- t.workflow do
10
- t.workflowId(path: { attribute: 'id' })
11
- t.process do
12
- t.name_(path: { attribute: 'name' }, index_as: %i[displayable not_searchable])
13
- t.status(path: { attribute: 'status' }, index_as: %i[displayable not_searchable])
14
- t.timestamp(path: { attribute: 'datetime' }, index_as: %i[displayable not_searchable]) # , :data_type => :date)
15
- t.elapsed(path: { attribute: 'elapsed' }, index_as: %i[displayable not_searchable])
16
- t.lifecycle(path: { attribute: 'lifecycle' }, index_as: %i[displayable not_searchable])
17
- t.attempts(path: { attribute: 'attempts' }, index_as: %i[displayable not_searchable])
18
- end
19
- end
20
- end
21
7
 
22
8
  # Called before saving, but after a pid has been assigned
23
9
  def build_location
@@ -30,53 +16,5 @@ module Dor
30
16
  def self.default_attributes
31
17
  super.merge(mimeType: 'application/xml')
32
18
  end
33
-
34
- def ng_xml
35
- @ng_xml ||= Nokogiri::XML::Document.parse(content)
36
- end
37
-
38
- # @param [Boolean] refresh The WorkflowDS caches the content retrieved from the workflow
39
- # service. This flag will invalidate the cached content and refetch it from the workflow
40
- # service directly
41
- def content(refresh = false)
42
- @content = nil if refresh
43
- @content ||= Dor::Config.workflow.client.all_workflows_xml pid
44
- rescue Dor::WorkflowException => e
45
- # TODO: I don't understand when this would be useful as this block ends up calling the workflow service too.
46
- # Why not just raise an exception here?
47
- Dor.logger.warn "Unable to connect to the workflow service #{e}. Falling back to placeholder XML"
48
- xml = Nokogiri::XML(%(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<workflows objectId="#{pid}"/>))
49
- digital_object.datastreams.keys.each do |dsid|
50
- next unless dsid =~ /WF$/
51
-
52
- ds_content = Nokogiri::XML(Dor::Config.workflow.client.workflow_xml('dor', pid, dsid))
53
- xml.root.add_child(ds_content.root)
54
- end
55
- @content ||= xml.to_xml
56
- end
57
-
58
- def workflows
59
- @workflows ||= workflow.nodeset.collect { |wf_node| Workflow::Document.new wf_node.to_xml }
60
- end
61
-
62
- # Finds the first workflow that is expedited, then returns the value of its priority
63
- #
64
- # @return [Integer] value of the priority. Defaults to 0 if none of the workflows are expedited
65
- def current_priority
66
- cp = workflows.detect(&:expedited?)
67
- return 0 if cp.nil?
68
-
69
- cp.priority.to_i
70
- end
71
-
72
- def to_solr(solr_doc = {}, *_args)
73
- # noop - indexing is done by the WorkflowsIndexer
74
- solr_doc
75
- end
76
-
77
- # maintain AF < 8 indexing behavior
78
- def prefix
79
- ''
80
- end
81
19
  end
82
20
  end