bulkrax 1.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 (133) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +205 -0
  3. data/README.md +202 -0
  4. data/Rakefile +42 -0
  5. data/app/assets/config/bulkrax_manifest.js +2 -0
  6. data/app/assets/javascripts/bulkrax/application.js +14 -0
  7. data/app/assets/javascripts/bulkrax/bulkrax.js +11 -0
  8. data/app/assets/javascripts/bulkrax/entries.js +15 -0
  9. data/app/assets/javascripts/bulkrax/exporters.js +60 -0
  10. data/app/assets/javascripts/bulkrax/importers.js.erb +166 -0
  11. data/app/assets/stylesheets/bulkrax/accordion.scss +40 -0
  12. data/app/assets/stylesheets/bulkrax/application.css +15 -0
  13. data/app/assets/stylesheets/bulkrax/coderay.scss +264 -0
  14. data/app/assets/stylesheets/bulkrax/import_export.scss +37 -0
  15. data/app/controllers/bulkrax/application_controller.rb +8 -0
  16. data/app/controllers/bulkrax/entries_controller.rb +44 -0
  17. data/app/controllers/bulkrax/exporters_controller.rb +125 -0
  18. data/app/controllers/bulkrax/importers_controller.rb +315 -0
  19. data/app/controllers/concerns/bulkrax/api.rb +29 -0
  20. data/app/factories/bulkrax/object_factory.rb +230 -0
  21. data/app/helpers/bulkrax/application_helper.rb +15 -0
  22. data/app/helpers/bulkrax/exporters_helper.rb +6 -0
  23. data/app/helpers/bulkrax/importers_helper.rb +13 -0
  24. data/app/helpers/bulkrax/validation_helper.rb +153 -0
  25. data/app/jobs/bulkrax/application_job.rb +6 -0
  26. data/app/jobs/bulkrax/child_relationships_job.rb +128 -0
  27. data/app/jobs/bulkrax/delete_work_job.rb +16 -0
  28. data/app/jobs/bulkrax/download_cloud_file_job.rb +18 -0
  29. data/app/jobs/bulkrax/export_work_job.rb +37 -0
  30. data/app/jobs/bulkrax/exporter_job.rb +14 -0
  31. data/app/jobs/bulkrax/import_work_collection_job.rb +41 -0
  32. data/app/jobs/bulkrax/import_work_job.rb +32 -0
  33. data/app/jobs/bulkrax/importer_job.rb +26 -0
  34. data/app/mailers/bulkrax/application_mailer.rb +8 -0
  35. data/app/matchers/bulkrax/application_matcher.rb +113 -0
  36. data/app/matchers/bulkrax/bagit_matcher.rb +6 -0
  37. data/app/matchers/bulkrax/csv_matcher.rb +6 -0
  38. data/app/matchers/bulkrax/oai_matcher.rb +6 -0
  39. data/app/models/bulkrax/application_record.rb +7 -0
  40. data/app/models/bulkrax/csv_collection_entry.rb +19 -0
  41. data/app/models/bulkrax/csv_entry.rb +163 -0
  42. data/app/models/bulkrax/entry.rb +104 -0
  43. data/app/models/bulkrax/exporter.rb +122 -0
  44. data/app/models/bulkrax/exporter_run.rb +7 -0
  45. data/app/models/bulkrax/import_failed.rb +13 -0
  46. data/app/models/bulkrax/importer.rb +155 -0
  47. data/app/models/bulkrax/importer_run.rb +8 -0
  48. data/app/models/bulkrax/oai_dc_entry.rb +6 -0
  49. data/app/models/bulkrax/oai_entry.rb +74 -0
  50. data/app/models/bulkrax/oai_qualified_dc_entry.rb +6 -0
  51. data/app/models/bulkrax/oai_set_entry.rb +19 -0
  52. data/app/models/bulkrax/rdf_collection_entry.rb +19 -0
  53. data/app/models/bulkrax/rdf_entry.rb +90 -0
  54. data/app/models/bulkrax/status.rb +25 -0
  55. data/app/models/bulkrax/xml_entry.rb +73 -0
  56. data/app/models/concerns/bulkrax/download_behavior.rb +61 -0
  57. data/app/models/concerns/bulkrax/errored_entries.rb +45 -0
  58. data/app/models/concerns/bulkrax/export_behavior.rb +58 -0
  59. data/app/models/concerns/bulkrax/file_factory.rb +140 -0
  60. data/app/models/concerns/bulkrax/has_local_processing.rb +7 -0
  61. data/app/models/concerns/bulkrax/has_matchers.rb +155 -0
  62. data/app/models/concerns/bulkrax/import_behavior.rb +90 -0
  63. data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +34 -0
  64. data/app/models/concerns/bulkrax/status_info.rb +56 -0
  65. data/app/parsers/bulkrax/application_parser.rb +299 -0
  66. data/app/parsers/bulkrax/bagit_parser.rb +157 -0
  67. data/app/parsers/bulkrax/csv_parser.rb +266 -0
  68. data/app/parsers/bulkrax/oai_dc_parser.rb +130 -0
  69. data/app/parsers/bulkrax/oai_qualified_dc_parser.rb +9 -0
  70. data/app/parsers/bulkrax/xml_parser.rb +103 -0
  71. data/app/views/bulkrax/entries/_parsed_metadata.html.erb +19 -0
  72. data/app/views/bulkrax/entries/_raw_metadata.html.erb +19 -0
  73. data/app/views/bulkrax/entries/show.html.erb +63 -0
  74. data/app/views/bulkrax/exporters/_form.html.erb +120 -0
  75. data/app/views/bulkrax/exporters/edit.html.erb +23 -0
  76. data/app/views/bulkrax/exporters/index.html.erb +67 -0
  77. data/app/views/bulkrax/exporters/new.html.erb +23 -0
  78. data/app/views/bulkrax/exporters/show.html.erb +124 -0
  79. data/app/views/bulkrax/importers/_bagit_fields.html.erb +54 -0
  80. data/app/views/bulkrax/importers/_browse_everything.html.erb +12 -0
  81. data/app/views/bulkrax/importers/_csv_fields.html.erb +39 -0
  82. data/app/views/bulkrax/importers/_edit_form_buttons.html.erb +16 -0
  83. data/app/views/bulkrax/importers/_form.html.erb +35 -0
  84. data/app/views/bulkrax/importers/_oai_fields.html.erb +42 -0
  85. data/app/views/bulkrax/importers/_xml_fields.html.erb +60 -0
  86. data/app/views/bulkrax/importers/edit.html.erb +20 -0
  87. data/app/views/bulkrax/importers/index.html.erb +77 -0
  88. data/app/views/bulkrax/importers/new.html.erb +25 -0
  89. data/app/views/bulkrax/importers/show.html.erb +175 -0
  90. data/app/views/bulkrax/importers/upload_corrected_entries.html.erb +37 -0
  91. data/app/views/bulkrax/shared/_bulkrax_errors.html.erb +52 -0
  92. data/app/views/bulkrax/shared/_bulkrax_field_mapping.html.erb +39 -0
  93. data/app/views/hyrax/dashboard/sidebar/_bulkrax_sidebar_additions.html.erb +6 -0
  94. data/app/views/hyrax/dashboard/sidebar/_repository_content.html.erb +19 -0
  95. data/app/views/layouts/bulkrax/application.html.erb +14 -0
  96. data/config/locales/bulkrax.en.yml +36 -0
  97. data/config/routes.rb +18 -0
  98. data/db/migrate/20181011230201_create_bulkrax_importers.rb +18 -0
  99. data/db/migrate/20181011230228_create_bulkrax_importer_runs.rb +16 -0
  100. data/db/migrate/20190325183136_create_bulkrax_entries.rb +16 -0
  101. data/db/migrate/20190601221109_add_status_to_entry.rb +9 -0
  102. data/db/migrate/20190715161939_add_collections_to_importer_runs.rb +6 -0
  103. data/db/migrate/20190715162044_change_collection_ids_on_entries.rb +5 -0
  104. data/db/migrate/20190729124607_create_bulkrax_exporters.rb +19 -0
  105. data/db/migrate/20190729134158_create_bulkrax_exporter_runs.rb +14 -0
  106. data/db/migrate/20190731114016_change_importer_and_exporter_to_polymorphic.rb +12 -0
  107. data/db/migrate/20191203225129_add_total_collection_records_to_importer_runs.rb +5 -0
  108. data/db/migrate/20191204191623_add_children_to_importer_runs.rb +6 -0
  109. data/db/migrate/20191204223857_change_total_records_to_total_work_entries.rb +6 -0
  110. data/db/migrate/20191212155530_change_entry_last_error.rb +19 -0
  111. data/db/migrate/20200108194557_add_validate_only_to_bulkrax_importers.rb +5 -0
  112. data/db/migrate/20200301232856_add_status_to_importers.rb +9 -0
  113. data/db/migrate/20200312190638_remove_foreign_key_from_bulkrax_entries.rb +5 -0
  114. data/db/migrate/20200326235838_add_status_to_exporters.rb +7 -0
  115. data/db/migrate/20200601204556_add_invalid_record_to_importer_run.rb +5 -0
  116. data/db/migrate/20200818055819_create_bulkrax_statuses.rb +18 -0
  117. data/db/migrate/20200819054016_move_to_statuses.rb +30 -0
  118. data/db/migrate/20201106014204_add_date_filter_and_status_to_bulkrax_exporters.rb +7 -0
  119. data/db/migrate/20201117220007_add_workflow_status_to_bulkrax_exporter.rb +5 -0
  120. data/db/migrate/20210806044408_remove_unused_last_error.rb +7 -0
  121. data/db/migrate/20210806065737_increase_text_sizes.rb +12 -0
  122. data/lib/bulkrax.rb +161 -0
  123. data/lib/bulkrax/engine.rb +37 -0
  124. data/lib/bulkrax/version.rb +5 -0
  125. data/lib/generators/bulkrax/install_generator.rb +80 -0
  126. data/lib/generators/bulkrax/templates/README +3 -0
  127. data/lib/generators/bulkrax/templates/app/assets/images/bulkrax/removed.png +0 -0
  128. data/lib/generators/bulkrax/templates/app/models/concerns/bulkrax/has_local_processing.rb +8 -0
  129. data/lib/generators/bulkrax/templates/bin/importer +140 -0
  130. data/lib/generators/bulkrax/templates/config/bulkrax_api.yml +84 -0
  131. data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +72 -0
  132. data/lib/tasks/bulkrax_tasks.rake +6 -0
  133. metadata +388 -0
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bulkrax
4
+ module API
5
+ private
6
+
7
+ def api_request?
8
+ true if request.headers['Content-Type'] == 'application/json'
9
+ end
10
+
11
+ def token_authenticate!
12
+ return true if request.headers['Authorization'] == "Token: #{ENV['BULKRAX_API_TOKEN']}"
13
+ return json_response('invalid', :unauthorized, "Please supply the authorization token")
14
+ end
15
+
16
+ def json_response(method, status = :ok, message = nil)
17
+ case method
18
+ when 'index'
19
+ render json: @importers, status: status
20
+ when 'new', 'edit'
21
+ render json: message, status: :method_not_allowed
22
+ when 'destroy', 'invalid'
23
+ render json: message, status: status
24
+ else
25
+ render json: message || @importer, status: status
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,230 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bulkrax
4
+ class ObjectFactory
5
+ extend ActiveModel::Callbacks
6
+ include Bulkrax::FileFactory
7
+ define_model_callbacks :save, :create
8
+ attr_reader :attributes, :object, :source_identifier_value, :klass, :replace_files, :update_files, :work_identifier
9
+
10
+ # rubocop:disable Metrics/ParameterLists
11
+ def initialize(attributes:, source_identifier_value:, work_identifier:, replace_files: false, user: nil, klass: nil, update_files: false)
12
+ @attributes = ActiveSupport::HashWithIndifferentAccess.new(attributes)
13
+ @replace_files = replace_files
14
+ @update_files = update_files
15
+ @user = user || User.batch_user
16
+ @work_identifier = work_identifier
17
+ @source_identifier_value = source_identifier_value
18
+ @klass = klass || Bulkrax.default_work_type.constantize
19
+ end
20
+ # rubocop:enable Metrics/ParameterLists
21
+
22
+ def run
23
+ arg_hash = { id: attributes[:id], name: 'UPDATE', klass: klass }
24
+ @object = find
25
+ if object
26
+ object.reindex_extent = Hyrax::Adapters::NestingIndexAdapter::LIMITED_REINDEX
27
+ ActiveSupport::Notifications.instrument('import.importer', arg_hash) { update }
28
+ else
29
+ ActiveSupport::Notifications.instrument('import.importer', arg_hash.merge(name: 'CREATE')) { create }
30
+ end
31
+ yield(object) if block_given?
32
+ object
33
+ end
34
+
35
+ def run!
36
+ self.run
37
+ # Create the error exception if the object is not validly saved for some reason
38
+ raise ActiveFedora::RecordInvalid, object if !object.persisted? || object.changed?
39
+ end
40
+
41
+ def update
42
+ raise "Object doesn't exist" unless object
43
+ destroy_existing_files if @replace_files && klass != Collection
44
+ attrs = attribute_update
45
+ run_callbacks :save do
46
+ klass == Collection ? update_collection(attrs) : work_actor.update(environment(attrs))
47
+ end
48
+ log_updated(object)
49
+ end
50
+
51
+ def find
52
+ return find_by_id if attributes[:id]
53
+ return search_by_identifier if attributes[work_identifier].present?
54
+ end
55
+
56
+ def find_by_id
57
+ klass.find(attributes[:id]) if klass.exists?(attributes[:id])
58
+ end
59
+
60
+ def find_or_create
61
+ o = find
62
+ return o if o
63
+ run(&:save!)
64
+ end
65
+
66
+ def search_by_identifier
67
+ query = { work_identifier =>
68
+ source_identifier_value }
69
+ # Query can return partial matches (something6 matches both something6 and something68)
70
+ # so we need to weed out any that are not the correct full match. But other items might be
71
+ # in the multivalued field, so we have to go through them one at a time.
72
+ match = klass.where(query).detect { |m| m.send(work_identifier).include?(source_identifier_value) }
73
+ return match if match
74
+ end
75
+
76
+ # An ActiveFedora bug when there are many habtm <-> has_many associations means they won't all get saved.
77
+ # https://github.com/projecthydra/active_fedora/issues/874
78
+ # 2+ years later, still open!
79
+ def create
80
+ attrs = create_attributes
81
+ @object = klass.new
82
+ object.reindex_extent = Hyrax::Adapters::NestingIndexAdapter::LIMITED_REINDEX
83
+ run_callbacks :save do
84
+ run_callbacks :create do
85
+ klass == Collection ? create_collection(attrs) : work_actor.create(environment(attrs))
86
+ end
87
+ end
88
+ log_created(object)
89
+ end
90
+
91
+ def log_created(obj)
92
+ msg = "Created #{klass.model_name.human} #{obj.id}"
93
+ Rails.logger.info("#{msg} (#{Array(attributes[work_identifier]).first})")
94
+ end
95
+
96
+ def log_updated(obj)
97
+ msg = "Updated #{klass.model_name.human} #{obj.id}"
98
+ Rails.logger.info("#{msg} (#{Array(attributes[work_identifier]).first})")
99
+ end
100
+
101
+ def log_deleted_fs(obj)
102
+ msg = "Deleted All Files from #{obj.id}"
103
+ Rails.logger.info("#{msg} (#{Array(attributes[work_identifier]).first})")
104
+ end
105
+
106
+ private
107
+
108
+ # @param [Hash] attrs the attributes to put in the environment
109
+ # @return [Hyrax::Actors::Environment]
110
+ def environment(attrs)
111
+ Hyrax::Actors::Environment.new(object, Ability.new(@user), attrs)
112
+ end
113
+
114
+ def work_actor
115
+ Hyrax::CurationConcern.actor
116
+ end
117
+
118
+ def create_collection(attrs)
119
+ attrs = collection_type(attrs)
120
+ object.members = members
121
+ object.member_of_collections = member_of_collections
122
+ object.attributes = attrs
123
+ object.apply_depositor_metadata(@user)
124
+ object.save!
125
+ end
126
+
127
+ def update_collection(attrs)
128
+ object.members = members
129
+ object.member_of_collections = member_of_collections
130
+ object.attributes = attrs
131
+ object.save!
132
+ end
133
+
134
+ # Collections don't respond to member_of_collections_attributes or member_of_collection_ids=
135
+ # or member_ids=
136
+ # Add them directly with members / member_of_collections
137
+ # collection should be in the form { id: collection_id }
138
+ # and collections [{ id: collection_id }]
139
+ # member_ids comes from
140
+ # @todo - consider performance implications although we wouldn't expect a Collection to be a member of many Collections
141
+ def members
142
+ ms = object.members.to_a
143
+ [:children].each do |atat|
144
+ next if attributes[atat].blank?
145
+ ms.concat(
146
+ Array.wrap(
147
+ find_collection(attributes[atat])
148
+ )
149
+ )
150
+ end
151
+ ms.flatten.compact.uniq
152
+ end
153
+
154
+ def member_of_collections
155
+ ms = object.member_of_collection_ids.to_a.map { |id| find_collection(id) }
156
+ [:collection, :collections].each do |atat|
157
+ next if attributes[atat].blank?
158
+ ms.concat(
159
+ Array.wrap(
160
+ find_collection(attributes[atat])
161
+ )
162
+ )
163
+ end
164
+ ms.flatten.compact.uniq
165
+ end
166
+
167
+ def find_collection(id)
168
+ case id
169
+ when Hash
170
+ Collection.find(id[:id])
171
+ when String
172
+ Collection.find(id)
173
+ when Array
174
+ id.map { |i| find_collection(i) }
175
+ else
176
+ []
177
+ end
178
+ end
179
+
180
+ def collection_type(attrs)
181
+ return attrs if attrs['collection_type_gid'].present?
182
+ attrs['collection_type_gid'] = Hyrax::CollectionType.find_or_create_default_collection_type.gid
183
+ attrs
184
+ end
185
+
186
+ # Strip out the :collection key, and add the member_of_collection_ids,
187
+ # which is used by Hyrax::Actors::AddAsMemberOfCollectionsActor
188
+ def create_attributes
189
+ return transform_attributes if klass == Collection
190
+ if attributes[:collection].present?
191
+ transform_attributes.except(:collection).merge(member_of_collections_attributes: { 0 => { id: collection.id } })
192
+ elsif attributes[:collections].present?
193
+ collection_ids = attributes[:collections].each.with_index.each_with_object({}) do |(element, index), ids|
194
+ ids[index] = { id: element }
195
+ end
196
+ transform_attributes.except(:collections).merge(member_of_collections_attributes: collection_ids)
197
+ else
198
+ transform_attributes
199
+ end
200
+ end
201
+
202
+ # Strip out the :collection key, and add the member_of_collection_ids,
203
+ # which is used by Hyrax::Actors::AddAsMemberOfCollectionsActor
204
+ def attribute_update
205
+ return transform_attributes.except(:id) if klass == Collection
206
+ if attributes[:collection].present?
207
+ transform_attributes.except(:id).except(:collection).merge(member_of_collections_attributes: { 0 => { id: collection.id } })
208
+ elsif attributes[:collections].present?
209
+ collection_ids = attributes[:collections].each.with_index.each_with_object({}) do |(element, index), ids|
210
+ ids[index] = element
211
+ end
212
+ transform_attributes.except(:id).except(:collections).merge(member_of_collections_attributes: collection_ids)
213
+ else
214
+ transform_attributes.except(:id)
215
+ end
216
+ end
217
+
218
+ # Override if we need to map the attributes from the parser in
219
+ # a way that is compatible with how the factory needs them.
220
+ def transform_attributes
221
+ attributes.slice(*permitted_attributes)
222
+ .merge(file_attributes(update_files))
223
+ end
224
+
225
+ # Regardless of what the Parser gives us, these are the properties we are prepared to accept.
226
+ def permitted_attributes
227
+ klass.properties.keys.map(&:to_sym) + %i[id edit_users edit_groups read_groups visibility work_members_attributes admin_set_id]
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ require 'coderay'
3
+
4
+ module Bulkrax
5
+ module ApplicationHelper
6
+ include ::Hyrax::HyraxHelperBehavior
7
+
8
+ def coderay(value, opts)
9
+ CodeRay
10
+ .scan(value, :ruby)
11
+ .html(opts)
12
+ .html_safe # rubocop:disable Rails/OutputSafety
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bulkrax
4
+ module ExportersHelper
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bulkrax
4
+ module ImportersHelper
5
+ # borrowd from batch-importer https://github.com/samvera-labs/hyrax-batch_ingest/blob/main/app/controllers/hyrax/batch_ingest/batches_controller.rb
6
+ def available_admin_sets
7
+ # Restrict available_admin_sets to only those current user can desposit to.
8
+ @available_admin_sets ||= Hyrax::Collections::PermissionsService.source_ids_for_deposit(ability: current_ability, source_type: 'admin_set').map do |admin_set_id|
9
+ [AdminSet.find(admin_set_id).title.first, admin_set_id]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bulkrax
4
+ module ValidationHelper
5
+ def valid_create_params?
6
+ check_admin_set
7
+ check_user
8
+ return true if valid_importer? &&
9
+ valid_commit? &&
10
+ valid_name? &&
11
+ valid_parser_klass? &&
12
+ valid_parser_fields?
13
+ end
14
+
15
+ def valid_update_params?
16
+ check_admin_set
17
+ check_user
18
+ return valid_commit?
19
+ end
20
+
21
+ def check_admin_set
22
+ if params[:importer][:admin_set_id].blank?
23
+ params[:importer][:admin_set_id] = AdminSet::DEFAULT_ID
24
+ else
25
+ AdminSet.find(params[:importer][:admin_set_id])
26
+ end
27
+ return true
28
+ rescue ActiveFedora::ObjectNotFoundError
29
+ logger.warn("AdminSet #{params[:importer][:admin_set_id]} not found. Using default admin set.")
30
+ params[:importer][:admin_set_id] = AdminSet::DEFAULT_ID
31
+ return true
32
+ end
33
+
34
+ def check_user
35
+ if params[:importer][:user_id].blank?
36
+ params[:importer][:user_id] = User.batch_user.id
37
+ else
38
+ User.find(params[:importer][:user_id])
39
+ end
40
+ return true
41
+ rescue ActiveRecord::RecordNotFound
42
+ logger.warn("User #{params[:importer][:user_id]} not found. Using default batch_user.")
43
+ params[:importer][:user_id] = User.batch_user.id
44
+ return true
45
+ end
46
+
47
+ def return_value(method, status, message)
48
+ @return_value ||= [method, status, message]
49
+ end
50
+
51
+ def return_json_response
52
+ json_response(@return_value[0], @return_value[1], @return_value[2])
53
+ end
54
+
55
+ def valid_importer?
56
+ return true if params[:importer].present?
57
+ return_value('invalid',
58
+ :unprocessable_entity,
59
+ "Missing required parameters")
60
+ return false
61
+ end
62
+
63
+ def valid_commit?
64
+ return true if params[:commit].present? && valid_commit_message?(params[:commit])
65
+ return_value('invalid',
66
+ :unprocessable_entity,
67
+ "[:commit] is required")
68
+ return false
69
+ end
70
+
71
+ def valid_name?
72
+ return true if params[:importer][:name].present?
73
+ return_value('invalid',
74
+ :unprocessable_entity,
75
+ "[:importer][:name] is required")
76
+ return false
77
+ end
78
+
79
+ def valid_parser_klass?
80
+ return true if params[:importer][:parser_klass].present?
81
+ return_value('invalid',
82
+ :unprocessable_entity,
83
+ "[:importer][:parser_klass] is required")
84
+ return false
85
+ end
86
+
87
+ def valid_parser_fields?
88
+ if params[:importer][:parser_fields].present?
89
+ case params[:importer][:parser_klass]
90
+ when 'Bulkrax::OaiParser'
91
+ return valid_oai?
92
+ when 'Bulkrax::CsvParser'
93
+ return valid_csv?
94
+ when 'Bulkrax::BagitParser'
95
+ return valid_bagit?
96
+ else
97
+ return_value('invalid',
98
+ :unprocessable_entity,
99
+ "#{params[:importer][:parser_klass]} not recognised")
100
+ return false
101
+ end
102
+ else
103
+ return_value('invalid',
104
+ :unprocessable_entity,
105
+ "params[:importer][:parser_fields] is required")
106
+ return false
107
+ end
108
+ end
109
+
110
+ def valid_bagit?
111
+ return true if params[:importer][:parser_fields][:metadata_format].present? &&
112
+ params[:importer][:parser_fields][:metadata_file_name].present? &&
113
+ params[:importer][:parser_fields][:import_file_path].present?
114
+ return_value('invalid',
115
+ :unprocessable_entity,
116
+ "[:importer][:parser_fields] [:metadata_format], [:metadata_file_name] and [:import_file_path] are required")
117
+ return false
118
+ end
119
+
120
+ def valid_csv?
121
+ return true if params[:importer][:parser_fields][:import_file_path].present?
122
+ return_value('invalid',
123
+ :unprocessable_entity,
124
+ "[:importer][:parser_fields] [:import_file_path] is required")
125
+ return false
126
+ end
127
+
128
+ def valid_oai?
129
+ return true if params[:base_url].present? &&
130
+ params[:importer][:parser_fields][:set].present? &&
131
+ params[:importer][:parser_fields][:collection_name].present?
132
+ return_value('invalid',
133
+ :unprocessable_entity,
134
+ "[:base_url], [:importer][:parser_fields][:set] and [:importer][:parser_fields][:collection_name] are required")
135
+ return false
136
+ end
137
+
138
+ def valid_commit_message?(commit)
139
+ # @todo - manual list because this line causes the importer script to fail - why?
140
+ # Bulkrax.api_definition['bulkrax']['importer']['commit']['valid_values'].include?(commit)
141
+ [
142
+ "Create",
143
+ "Create and Import",
144
+ "Update Importer",
145
+ "Update and Re-Import (update metadata and replace files)",
146
+ "Update and Harvest Updated Items",
147
+ "Update and Re-Harvest All Items",
148
+ "Update and Re-Import (update metadata only)",
149
+ "Update and Import (importer has not yet been run)"
150
+ ].include?(commit)
151
+ end
152
+ end
153
+ end