bulkrax 1.0.2 → 2.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/controllers/bulkrax/exporters_controller.rb +12 -4
  4. data/app/controllers/bulkrax/importers_controller.rb +22 -17
  5. data/app/factories/bulkrax/object_factory.rb +36 -59
  6. data/app/jobs/bulkrax/create_relationships_job.rb +187 -0
  7. data/app/jobs/bulkrax/delete_work_job.rb +6 -2
  8. data/app/jobs/bulkrax/export_work_job.rb +3 -1
  9. data/app/jobs/bulkrax/exporter_job.rb +1 -0
  10. data/app/jobs/bulkrax/{import_work_collection_job.rb → import_collection_job.rb} +2 -2
  11. data/app/jobs/bulkrax/importer_job.rb +16 -1
  12. data/app/matchers/bulkrax/application_matcher.rb +5 -5
  13. data/app/models/bulkrax/csv_collection_entry.rb +8 -6
  14. data/app/models/bulkrax/csv_entry.rb +124 -66
  15. data/app/models/bulkrax/entry.rb +19 -8
  16. data/app/models/bulkrax/exporter.rb +12 -5
  17. data/app/models/bulkrax/importer.rb +12 -5
  18. data/app/models/bulkrax/oai_entry.rb +5 -1
  19. data/app/models/bulkrax/rdf_entry.rb +16 -7
  20. data/app/models/bulkrax/xml_entry.rb +4 -0
  21. data/app/models/concerns/bulkrax/export_behavior.rb +2 -2
  22. data/app/models/concerns/bulkrax/has_matchers.rb +44 -13
  23. data/app/models/concerns/bulkrax/import_behavior.rb +35 -5
  24. data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +19 -0
  25. data/app/models/concerns/bulkrax/status_info.rb +4 -4
  26. data/app/parsers/bulkrax/application_parser.rb +59 -84
  27. data/app/parsers/bulkrax/bagit_parser.rb +12 -3
  28. data/app/parsers/bulkrax/csv_parser.rb +117 -63
  29. data/app/parsers/bulkrax/oai_dc_parser.rb +5 -2
  30. data/app/parsers/bulkrax/xml_parser.rb +5 -0
  31. data/app/views/bulkrax/exporters/_form.html.erb +1 -1
  32. data/app/views/bulkrax/exporters/show.html.erb +2 -1
  33. data/app/views/bulkrax/importers/index.html.erb +15 -17
  34. data/app/views/bulkrax/importers/show.html.erb +6 -2
  35. data/config/locales/bulkrax.en.yml +1 -0
  36. data/db/migrate/20190731114016_change_importer_and_exporter_to_polymorphic.rb +5 -1
  37. data/db/migrate/20211004170708_change_bulkrax_statuses_error_message_column_type_to_text.rb +5 -0
  38. data/db/migrate/20211203195233_rename_children_counters_to_relationships.rb +6 -0
  39. data/lib/bulkrax/engine.rb +1 -1
  40. data/lib/bulkrax/version.rb +1 -1
  41. data/lib/bulkrax.rb +9 -17
  42. data/lib/generators/bulkrax/templates/bin/importer +17 -11
  43. data/lib/generators/bulkrax/templates/config/bulkrax_api.yml +3 -1
  44. data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +7 -12
  45. metadata +6 -4
  46. data/app/jobs/bulkrax/child_relationships_job.rb +0 -128
@@ -75,7 +75,7 @@ module Bulkrax
75
75
 
76
76
  new_entry = collection_entry_class.where(importerexporter: importerexporter, identifier: unique_collection_identifier, raw_metadata: metadata).first_or_create!
77
77
  # perform now to ensure this gets created before work imports start
78
- ImportWorkCollectionJob.perform_now(new_entry.id, importerexporter.current_run.id)
78
+ ImportCollectionJob.perform_now(new_entry.id, importerexporter.current_run.id)
79
79
  increment_counters(index, true)
80
80
  end
81
81
  end
@@ -119,7 +119,10 @@ module Bulkrax
119
119
  end
120
120
  end
121
121
 
122
- def create_parent_child_relationships; end
122
+ # TODO: change to differentiate between collection and work records when adding ability to import collection metadata
123
+ def works_total
124
+ total
125
+ end
123
126
 
124
127
  def total
125
128
  @total ||= records(quick: true).doc.find(".//resumptionToken").to_a.first.attributes["completeListSize"].to_i
@@ -12,6 +12,11 @@ module Bulkrax
12
12
  # @todo not yet supported
13
13
  def create_collections; end
14
14
 
15
+ # TODO: change to differentiate between collection and work records when adding ability to import collection metadata
16
+ def works_total
17
+ total
18
+ end
19
+
15
20
  # @todo not yet supported
16
21
  def import_fields; end
17
22
 
@@ -32,7 +32,7 @@
32
32
  prompt: 'Select from the list',
33
33
  label_html: { class: 'importer export-source-option hidden' },
34
34
  input_html: { class: 'importer export-source-option hidden' },
35
- collection: form.object.importers_list %>
35
+ collection: form.object.importers_list.sort %>
36
36
 
37
37
  <%= form.input :export_source_collection,
38
38
  prompt: 'Start typing ...',
@@ -57,8 +57,9 @@
57
57
  <strong><%= t('bulkrax.exporter.labels.limit') %>:</strong>
58
58
  <%= @exporter.limit %>
59
59
  </p>
60
+ <%= render partial: 'bulkrax/shared/bulkrax_errors', locals: {item: @exporter} %>
60
61
 
61
- <%= render partial: 'bulkrax/shared/bulkrax_field_mapping', locals: {item: @exporter} %>
62
+ <%= render partial: 'bulkrax/shared/bulkrax_field_mapping', locals: {item: @exporter} %>
62
63
 
63
64
  <%# Currently, no parser-specific fields exist on Exporter,
64
65
  thus there's no real reason to always show this field %>
@@ -31,23 +31,21 @@
31
31
  </thead>
32
32
  <tbody>
33
33
  <% @importers.each do |importer| %>
34
- <tr>
35
- <th scope="row"><%= link_to importer.name, importer_path(importer) %></th>
36
- <td>
37
- <%= importer.status %>
38
- </td>
39
- <td><%= importer.last_imported_at.strftime("%b %d, %Y") if importer.last_imported_at %></td>
40
- <td><%= importer.next_import_at.strftime("%b %d, %Y") if importer.next_import_at %></td>
41
- <td><%= importer.importer_runs.last&.enqueued_records %></td>
42
- <td><%= (importer.importer_runs.last&.processed_collections || 0) + (importer.importer_runs.last&.processed_records || 0) %></td>
43
- <td><%= (importer.importer_runs.last&.failed_collections || 0) + (importer.importer_runs.last&.failed_records || 0) %></td>
44
- <td><%= importer.importer_runs.last&.deleted_records %></td>
45
- <td><%= importer.importer_runs.last&.total_collection_entries %></td>
46
- <td><%= importer.importer_runs.last&.total_work_entries %></td>
47
- <td><%= link_to raw('<span class="glyphicon glyphicon-info-sign"></span>'), importer_path(importer) %></td>
48
- <td><%= link_to raw('<span class="glyphicon glyphicon-pencil"></span>'), edit_importer_path(importer) %></td>
49
- <td><%= link_to raw('<span class="glyphicon glyphicon-remove"></span>'), importer, method: :delete, data: { confirm: 'Are you sure?' } %></td>
50
- </tr>
34
+ <tr>
35
+ <th scope="row"><%= link_to importer.name, importer_path(importer) %></th>
36
+ <td><%= importer.status %></td>
37
+ <td><%= importer.last_imported_at.strftime("%b %d, %Y") if importer.last_imported_at %></td>
38
+ <td><%= importer.next_import_at.strftime("%b %d, %Y") if importer.next_import_at %></td>
39
+ <td><%= importer.importer_runs.last&.enqueued_records %></td>
40
+ <td><%= (importer.importer_runs.last&.processed_collections || 0) + (importer.importer_runs.last&.processed_records || 0) %></td>
41
+ <td><%= (importer.importer_runs.last&.failed_collections || 0) + (importer.importer_runs.last&.failed_records || 0) %></td>
42
+ <td><%= importer.importer_runs.last&.deleted_records %></td>
43
+ <td><%= importer.importer_runs.last&.total_collection_entries %></td>
44
+ <td><%= importer.importer_runs.last&.total_work_entries %></td>
45
+ <td><%= link_to raw('<span class="glyphicon glyphicon-info-sign"></span>'), importer_path(importer) %></td>
46
+ <td><%= link_to raw('<span class="glyphicon glyphicon-pencil"></span>'), edit_importer_path(importer) %></td>
47
+ <td><%= link_to raw('<span class="glyphicon glyphicon-remove"></span>'), importer, method: :delete, data: { confirm: 'Are you sure?' } %></td>
48
+ </tr>
51
49
  <% end %>
52
50
  </tbody>
53
51
  </table>
@@ -101,8 +101,10 @@
101
101
  <td><%= e.id %></td>
102
102
  <% if e.status == "Complete" %>
103
103
  <td><span class="glyphicon glyphicon-ok" style="color: green;"></span> <%= e.status %></td>
104
+ <% elsif e.status == "Pending" %>
105
+ <td><span class="glyphicon glyphicon-option-horizontal" style="color: blue;"></span> <%= e.status %></td>
104
106
  <% else %>
105
- <td><span class="glyphicon glyphicon-remove" style="color: red;"></span> <%= e.status %></td>
107
+ <td><span class="glyphicon glyphicon-remove" style="color: <%= e.status == 'Deleted' ? 'green' : 'red' %>;"></span> <%= e.status %></td>
106
108
  <% end %>
107
109
  <% if e.last_error.present? %>
108
110
  <td><%= link_to e.last_error.dig("error_class"), bulkrax.importer_entry_path(@importer.id, e.id) %></td>
@@ -137,8 +139,10 @@
137
139
  <td><%= e.id %></td>
138
140
  <% if e.status == "Complete" %>
139
141
  <td><span class="glyphicon glyphicon-ok" style="color: green;"></span> <%= e.status %></td>
142
+ <% elsif e.status == "Pending" %>
143
+ <td><span class="glyphicon glyphicon-option-horizontal" style="color: blue;"></span> <%= e.status %></td>
140
144
  <% else %>
141
- <td><span class="glyphicon glyphicon-remove" style="color: red;"></span> <%= e.status %></td>
145
+ <td><span class="glyphicon glyphicon-remove" style="color: <%= e.status == 'Deleted' ? 'green' : 'red' %>;"></span> <%= e.status %></td>
142
146
  <% end %>
143
147
  <% if e.last_error.present? %>
144
148
  <td><%= link_to e.last_error.dig("error_class"), bulkrax.importer_entry_path(@importer.id, e.id) %></td>
@@ -6,6 +6,7 @@ en:
6
6
  importers: Importers
7
7
  exporter:
8
8
  labels:
9
+ all: All
9
10
  collection: Collection
10
11
  export_format: Export Format
11
12
  export_from: Export From
@@ -6,7 +6,11 @@ end
6
6
 
7
7
  class ChangeImporterAndExporterToPolymorphic < ActiveRecord::Migration[5.1]
8
8
  def change
9
- rename_column :bulkrax_entries, :importer_id, :importerexporter_id if column_exists?(:bulkrax_entries, :importer_id)
9
+ if column_exists?(:bulkrax_entries, :importer_id)
10
+ remove_foreign_key :bulkrax_entries, column: :importer_id
11
+ remove_index :bulkrax_entries, :importer_id
12
+ rename_column :bulkrax_entries, :importer_id, :importerexporter_id
13
+ end
10
14
  add_column :bulkrax_entries, :importerexporter_type, :string, after: :id, default: 'Bulkrax::Importer' unless column_exists?(:bulkrax_entries, :importerexporter_type)
11
15
  end
12
16
  end
@@ -0,0 +1,5 @@
1
+ class ChangeBulkraxStatusesErrorMessageColumnTypeToText < ActiveRecord::Migration[5.1]
2
+ def change
3
+ change_column :bulkrax_statuses, :error_message, :text
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class RenameChildrenCountersToRelationships < ActiveRecord::Migration[5.2]
2
+ def change
3
+ rename_column :bulkrax_importer_runs, :processed_children, :processed_relationships
4
+ rename_column :bulkrax_importer_runs, :failed_children, :failed_relationships
5
+ end
6
+ end
@@ -25,7 +25,7 @@ module Bulkrax
25
25
  config.after_initialize do
26
26
  my_engine_root = Bulkrax::Engine.root.to_s
27
27
  paths = ActionController::Base.view_paths.collect(&:to_s)
28
- hyrax_path = paths.detect { |path| path.match('/hyrax-') }
28
+ hyrax_path = paths.detect { |path| path.match(/\/hyrax-[\d\.]+.*/) }
29
29
  paths = if hyrax_path
30
30
  paths.insert(paths.index(hyrax_path), my_engine_root + '/app/views')
31
31
  else
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bulkrax
4
- VERSION = '1.0.2'
4
+ VERSION = '2.0.0'
5
5
  end
data/lib/bulkrax.rb CHANGED
@@ -5,12 +5,14 @@ require 'active_support/all'
5
5
 
6
6
  module Bulkrax
7
7
  class << self
8
+ # TODO: remove collection_field_mapping when releasing v2
8
9
  mattr_accessor :parsers,
9
10
  :default_work_type,
10
11
  :default_field_mapping,
11
12
  :collection_field_mapping,
12
13
  :fill_in_blank_source_identifiers,
13
- :parent_child_field_mapping,
14
+ :related_children_field_mapping,
15
+ :related_parents_field_mapping,
14
16
  :reserved_properties,
15
17
  :field_mappings,
16
18
  :import_path,
@@ -33,26 +35,16 @@ module Bulkrax
33
35
  self.removed_image_path = Bulkrax::Engine.root.join('spec', 'fixtures', 'removed.png').to_s
34
36
  self.server_name = 'bulkrax@example.com'
35
37
 
36
- # @todo, merge parent_child_field_mapping and collection_field_mapping into field_mappings,
37
- # or make them settable per import some other way.
38
-
39
- # Field_mapping for establishing a parent-child relationship (FROM parent TO child)
40
- # This can be a Collection to Work, or Work to Work relationship
41
- # This value IS NOT used for OAI, so setting the OAI Entries here will have no effect
42
- # The mapping is supplied per Entry, provide the full class name as a string, eg. 'Bulkrax::CsvEntry'
43
- # Example:
44
- # {
45
- # 'Bulkrax::RdfEntry' => 'http://opaquenamespace.org/ns/contents',
46
- # 'Bulkrax::CsvEntry' => 'children'
47
- # }
48
- # By default no parent-child relationships are added
49
- self.parent_child_field_mapping = {}
50
-
38
+ # NOTE: Creating Collections using the collection_field_mapping will no longer be supported as of Bulkrax version 3.0.
39
+ # Please configure Bulkrax to use related_parents_field_mapping and related_children_field_mapping instead.
40
+ # TODO: remove collection_field_mapping when releasing v2
51
41
  # Field_mapping for establishing a collection relationship (FROM work TO collection)
52
42
  # This value IS NOT used for OAI, so setting the OAI Entries here will have no effect
53
43
  # The mapping is supplied per Entry, provide the full class name as a string, eg. 'Bulkrax::CsvEntry'
54
44
  # The default value for CSV is collection
55
- self.collection_field_mapping = {}
45
+ self.collection_field_mapping = {
46
+ 'Bulkrax::CsvEntry' => 'collection'
47
+ }
56
48
 
57
49
  # Hash of Generic field_mappings for use in the view
58
50
  # There must be one field_mappings hash per view parial
@@ -6,18 +6,11 @@ require_relative '../config/environment'
6
6
  require 'slop'
7
7
 
8
8
  def main(opts = {})
9
- if opts[:importer_id].blank? && invalid?(opts)
10
- puts 'Missing required parameters'
11
- help
12
- end
13
-
14
- if opts[:auth_token].blank?
15
- puts 'Missing Authentication Token --auth_token'
16
- exit
17
- end
9
+ check_required_params
18
10
 
19
11
  update = opts[:importer_id].present?
20
- url = build_url(opts.delete(:importer_id), opts.delete(:url))
12
+ port = opts[:port].presence
13
+ url = build_url(opts.delete(:importer_id), opts.delete(:url), port)
21
14
 
22
15
  headers = { 'Content-Type' => 'application/json' }
23
16
  headers['Authorization'] = "Token: #{opts.delete(:auth_token)}"
@@ -43,6 +36,18 @@ def main(opts = {})
43
36
  puts "#{response.status} - #{response.body.truncate(200)}"
44
37
  end
45
38
 
39
+ def check_required_params
40
+ if opts[:importer_id].blank? && invalid?(opts)
41
+ puts 'Missing required parameters'
42
+ help
43
+ end
44
+
45
+ if opts[:auth_token].blank? # rubocop:disable Style/GuardClause
46
+ puts 'Missing Authentication Token --auth_token'
47
+ exit
48
+ end
49
+ end
50
+
46
51
  def invalid?(opts)
47
52
  required_params.each do |p|
48
53
  return true if opts[p.to_sym].blank?
@@ -74,11 +79,12 @@ def build_params(opts = {})
74
79
  return params.compact
75
80
  end
76
81
 
77
- def build_url(importer_id, url)
82
+ def build_url(importer_id, url, port = nil)
78
83
  if url.nil?
79
84
  protocol = Rails.application.config.force_ssl ? 'https://' : 'http://'
80
85
  host = Rails.application.config.action_mailer.default_url_options[:host]
81
86
  url = "#{protocol}#{host}"
87
+ url = "#{url}:#{port}" if port
82
88
  end
83
89
  path = Bulkrax::Engine.routes.url_helpers.polymorphic_path(Bulkrax::Importer)
84
90
  url = File.join(url, path)
@@ -81,4 +81,6 @@ bulkrax:
81
81
  - "Update and Import (importer has not yet been run)"
82
82
  auth_token:
83
83
  definition: 'Authentication token. Required for JSON requests only.'
84
- required: true
84
+ required: true
85
+ port:
86
+ definition: 'Port to use in http request. Defaults to 80. May need to set to 3000 when running in the development environment'
@@ -19,18 +19,8 @@ Bulkrax.setup do |config|
19
19
  # Server name for oai request header
20
20
  # config.server_name = 'my_server@name.com'
21
21
 
22
- # Field_mapping for establishing a parent-child relationship (FROM parent TO child)
23
- # This can be a Collection to Work, or Work to Work relationship
24
- # This value IS NOT used for OAI, so setting the OAI Entries here will have no effect
25
- # The mapping is supplied per Entry, provide the full class name as a string, eg. 'Bulkrax::CsvEntry'
26
- # Example:
27
- # {
28
- # 'Bulkrax::RdfEntry' => 'http://opaquenamespace.org/ns/contents',
29
- # 'Bulkrax::CsvEntry' => 'children'
30
- # }
31
- # By default no parent-child relationships are added
32
- # config.parent_child_field_mapping = { }
33
-
22
+ # NOTE: Creating Collections using the collection_field_mapping will no longer be supported as of Bulkrax version 3.0.
23
+ # Please configure Bulkrax to use related_parents_field_mapping and related_children_field_mapping instead.
34
24
  # Field_mapping for establishing a collection relationship (FROM work TO collection)
35
25
  # This value IS NOT used for OAI, so setting the OAI parser here will have no effect
36
26
  # The mapping is supplied per Entry, provide the full class name as a string, eg. 'Bulkrax::CsvEntry'
@@ -48,6 +38,11 @@ Bulkrax.setup do |config|
48
38
  # e.g. to exclude date
49
39
  # config.field_mappings["Bulkrax::OaiDcParser"]["date"] = { from: ["date"], excluded: true }
50
40
  #
41
+ # e.g. to import parent-child relationships
42
+ # config.field_mappings['Bulkrax::CsvParser']['parents'] = { from: ['parents'], related_parents_field_mapping: true }
43
+ # config.field_mappings['Bulkrax::CsvParser']['children'] = { from: ['children'], related_children_field_mapping: true }
44
+ # (For more info on importing relationships, see Bulkrax Wiki: https://github.com/samvera-labs/bulkrax/wiki/Configuring-Bulkrax#parent-child-relationship-field-mappings)
45
+ #
51
46
  # # e.g. to add the required source_identifier field
52
47
  # # config.field_mappings["Bulkrax::CsvParser"]["source_id"] = { from: ["old_source_id"], source_identifier: true }
53
48
  # If you want Bulkrax to fill in source_identifiers for you, see below
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bulkrax
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Kaufman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-28 00:00:00.000000000 Z
11
+ date: 2022-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -255,12 +255,12 @@ files:
255
255
  - app/helpers/bulkrax/importers_helper.rb
256
256
  - app/helpers/bulkrax/validation_helper.rb
257
257
  - app/jobs/bulkrax/application_job.rb
258
- - app/jobs/bulkrax/child_relationships_job.rb
258
+ - app/jobs/bulkrax/create_relationships_job.rb
259
259
  - app/jobs/bulkrax/delete_work_job.rb
260
260
  - app/jobs/bulkrax/download_cloud_file_job.rb
261
261
  - app/jobs/bulkrax/export_work_job.rb
262
262
  - app/jobs/bulkrax/exporter_job.rb
263
- - app/jobs/bulkrax/import_work_collection_job.rb
263
+ - app/jobs/bulkrax/import_collection_job.rb
264
264
  - app/jobs/bulkrax/import_work_job.rb
265
265
  - app/jobs/bulkrax/importer_job.rb
266
266
  - app/mailers/bulkrax/application_mailer.rb
@@ -351,6 +351,8 @@ files:
351
351
  - db/migrate/20201117220007_add_workflow_status_to_bulkrax_exporter.rb
352
352
  - db/migrate/20210806044408_remove_unused_last_error.rb
353
353
  - db/migrate/20210806065737_increase_text_sizes.rb
354
+ - db/migrate/20211004170708_change_bulkrax_statuses_error_message_column_type_to_text.rb
355
+ - db/migrate/20211203195233_rename_children_counters_to_relationships.rb
354
356
  - lib/bulkrax.rb
355
357
  - lib/bulkrax/engine.rb
356
358
  - lib/bulkrax/version.rb
@@ -1,128 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bulkrax
4
- class ChildWorksError < RuntimeError; end
5
- class ChildRelationshipsJob < ApplicationJob
6
- queue_as :import
7
-
8
- def perform(*args)
9
- @args = args
10
-
11
- if entry.factory_class == Collection
12
- collection_membership
13
- else
14
- work_membership
15
- end
16
- # Not all of the Works/Collections exist yet; reschedule
17
- rescue Bulkrax::ChildWorksError
18
- reschedule(args[0], args[1], args[2])
19
- end
20
-
21
- def collection_membership
22
- # add collection to works
23
- member_of_collection = []
24
- child_works_hash.each { |k, v| member_of_collection << k if v[:class_name] != 'Collection' }
25
- member_of_collection.each { |work| work_child_collection_parent(work) }
26
-
27
- # add collections to collection
28
- members_collections = []
29
- child_works_hash.each { |k, v| members_collections << k if v[:class_name] == 'Collection' }
30
- collection_parent_collection_child(members_collections) if members_collections.present?
31
- end
32
-
33
- def work_membership
34
- # add works to work
35
- # reject any Collections, they can't be children of Works
36
- members_works = []
37
- # reject any Collections, they can't be children of Works
38
- child_works_hash.each { |k, v| members_works << k if v[:class_name] != 'Collection' }
39
- if members_works.length < child_entries.length # rubocop:disable Style/IfUnlessModifier
40
- Rails.logger.warn("Cannot add collections as children of works: #{(@child_entries.length - members_works.length)} collections were discarded for parent entry #{@entry.id} (of #{@child_entries.length})")
41
- end
42
- work_parent_work_child(members_works) if members_works.present?
43
- end
44
-
45
- def entry
46
- @entry ||= Bulkrax::Entry.find(@args[0])
47
- end
48
-
49
- def child_entries
50
- @child_entries ||= @args[1].map { |e| Bulkrax::Entry.find(e) }
51
- end
52
-
53
- def child_works_hash
54
- @child_works_hash ||= child_entries.each_with_object({}) do |child_entry, hash|
55
- work = child_entry.factory.find
56
- # If we can't find the Work/Collection, raise a custom error
57
- raise ChildWorksError if work.blank?
58
- hash[work.id] = { class_name: work.class.to_s, entry.parser.source_identifier => child_entry.identifier }
59
- end
60
- end
61
-
62
- def importer_run_id
63
- @args[2]
64
- end
65
-
66
- def user
67
- @user ||= entry.importerexporter.user
68
- end
69
-
70
- private
71
-
72
- # rubocop:disable Rails/SkipsModelValidations
73
- # Work-Collection membership is added to the child as member_of_collection_ids
74
- # This is adding the reverse relatinship, from the child to the parent
75
- def work_child_collection_parent(work_id)
76
- attrs = { id: work_id, collections: [{ id: entry&.factory&.find&.id }] }
77
- Bulkrax::ObjectFactory.new(attributes: attrs,
78
- source_identifier_value: child_works_hash[work_id][entry.parser.source_identifier],
79
- work_identifier: entry.parser.work_identifier,
80
- replace_files: false,
81
- user: user,
82
- klass: child_works_hash[work_id][:class_name].constantize).run
83
- ImporterRun.find(importer_run_id).increment!(:processed_children)
84
- rescue StandardError => e
85
- entry.status_info(e)
86
- ImporterRun.find(importer_run_id).increment!(:failed_children)
87
- end
88
-
89
- # Collection-Collection membership is added to the as member_ids
90
- def collection_parent_collection_child(member_ids)
91
- attrs = { id: entry&.factory&.find&.id, children: member_ids }
92
- Bulkrax::ObjectFactory.new(attributes: attrs,
93
- source_identifier_value: entry.identifier,
94
- work_identifier: entry.parser.work_identifier,
95
- replace_files: false,
96
- user: user,
97
- klass: entry.factory_class).run
98
- ImporterRun.find(importer_run_id).increment!(:processed_children)
99
- rescue StandardError => e
100
- entry.status_info(e)
101
- ImporterRun.find(importer_run_id).increment!(:failed_children)
102
- end
103
-
104
- # Work-Work membership is added to the parent as member_ids
105
- def work_parent_work_child(member_ids)
106
- # build work_members_attributes
107
- attrs = { id: entry&.factory&.find&.id,
108
- work_members_attributes: member_ids.each.with_index.each_with_object({}) do |(member, index), ids|
109
- ids[index] = { id: member }
110
- end }
111
- Bulkrax::ObjectFactory.new(attributes: attrs,
112
- source_identifier_value: entry.identifier,
113
- work_identifier: entry.parser.work_identifier,
114
- replace_files: false,
115
- user: user,
116
- klass: entry.factory_class).run
117
- ImporterRun.find(importer_run_id).increment!(:processed_children)
118
- rescue StandardError => e
119
- entry.status_info(e)
120
- ImporterRun.find(importer_run_id).increment!(:failed_children)
121
- end
122
- # rubocop:enable Rails/SkipsModelValidations
123
-
124
- def reschedule(entry_id, child_entry_ids, importer_run_id)
125
- ChildRelationshipsJob.set(wait: 10.minutes).perform_later(entry_id, child_entry_ids, importer_run_id)
126
- end
127
- end
128
- end