bulkrax 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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