curation_concerns-models 0.1.0 → 0.2.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 (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/Rakefile +1 -1
  4. data/app/actors/concerns/curation_concerns/manages_embargoes_actor.rb +11 -19
  5. data/app/actors/curation_concerns/base_actor.rb +41 -45
  6. data/app/actors/curation_concerns/embargo_actor.rb +19 -0
  7. data/app/actors/curation_concerns/file_set_actor.rb +200 -0
  8. data/app/actors/curation_concerns/lease_actor.rb +19 -0
  9. data/app/actors/curation_concerns/work_actor_behavior.rb +55 -58
  10. data/app/indexers/curation_concerns/collection_indexer.rb +10 -0
  11. data/app/indexers/curation_concerns/file_set_indexing_service.rb +24 -0
  12. data/app/{services/curation_concerns/generic_work_indexing_service.rb → indexers/curation_concerns/work_indexing_service.rb} +6 -6
  13. data/app/jobs/active_fedora_id_based_job.rb +5 -12
  14. data/app/jobs/audit_job.rb +11 -17
  15. data/app/jobs/characterize_job.rb +8 -7
  16. data/app/jobs/create_derivatives_job.rb +8 -11
  17. data/app/jobs/import_url_job.rb +12 -25
  18. data/app/jobs/ingest_file_job.rb +16 -0
  19. data/app/jobs/ingest_local_file_job.rb +14 -35
  20. data/app/jobs/resolrize_job.rb +3 -5
  21. data/app/jobs/upload_set_update_job.rb +68 -0
  22. data/app/models/checksum_audit_log.rb +2 -3
  23. data/app/models/concerns/curation_concerns/ability.rb +18 -10
  24. data/app/models/concerns/curation_concerns/basic_metadata.rb +1 -3
  25. data/app/models/concerns/curation_concerns/collection_behavior.rb +13 -14
  26. data/app/models/concerns/curation_concerns/file_set/belongs_to_upload_sets.rb +15 -0
  27. data/app/models/concerns/curation_concerns/{generic_file → file_set}/belongs_to_works.rb +8 -14
  28. data/app/models/concerns/curation_concerns/file_set/derivatives.rb +54 -0
  29. data/app/models/concerns/curation_concerns/{generic_file → file_set}/full_text_indexing.rb +1 -2
  30. data/app/models/concerns/curation_concerns/{generic_file → file_set}/indexing.rb +2 -2
  31. data/app/models/concerns/curation_concerns/{generic_file → file_set}/versions.rb +2 -3
  32. data/app/models/concerns/curation_concerns/file_set_behavior.rb +36 -0
  33. data/app/models/concerns/curation_concerns/generic_file.rb +1 -1
  34. data/app/models/concerns/curation_concerns/has_representative.rb +6 -7
  35. data/app/models/concerns/curation_concerns/human_readable_type.rb +5 -7
  36. data/app/models/concerns/curation_concerns/permissions.rb +2 -2
  37. data/app/models/concerns/curation_concerns/permissions/readable.rb +0 -1
  38. data/app/models/concerns/curation_concerns/permissions/writable.rb +10 -51
  39. data/app/models/concerns/curation_concerns/serializers.rb +3 -5
  40. data/app/models/concerns/curation_concerns/solr_document_behavior.rb +37 -40
  41. data/app/models/concerns/curation_concerns/upload_set_behavior.rb +38 -0
  42. data/app/models/concerns/curation_concerns/user.rb +4 -51
  43. data/app/models/concerns/curation_concerns/with_file_sets.rb +28 -0
  44. data/app/models/concerns/curation_concerns/{generic_work_behavior.rb → work_behavior.rb} +12 -6
  45. data/app/models/curation_concerns/classify_concern.rb +7 -7
  46. data/app/models/curation_concerns/quick_classification_query.rb +6 -7
  47. data/app/models/single_use_link.rb +34 -0
  48. data/app/models/upload_set.rb +3 -0
  49. data/app/services/curation_concerns/derivative_path.rb +32 -0
  50. data/app/services/curation_concerns/{generic_file_audit_service.rb → file_set_audit_service.rb} +17 -18
  51. data/app/services/curation_concerns/indexes_thumbnails.rb +14 -0
  52. data/app/services/curation_concerns/local_file_service.rb +10 -0
  53. data/app/services/curation_concerns/lock_manager.rb +40 -0
  54. data/app/services/curation_concerns/noid.rb +1 -1
  55. data/app/services/curation_concerns/persist_derivatives.rb +33 -0
  56. data/app/services/curation_concerns/persist_directly_contained_output_file_service.rb +26 -0
  57. data/app/services/curation_concerns/repository_audit_service.rb +1 -3
  58. data/app/services/curation_concerns/thumbnail_path_service.rb +46 -0
  59. data/app/services/curation_concerns/time_service.rb +7 -0
  60. data/app/services/curation_concerns/versioning_service.rb +11 -12
  61. data/curation_concerns-models.gemspec +6 -6
  62. data/lib/curation_concerns/configuration.rb +154 -0
  63. data/lib/curation_concerns/messages.rb +26 -26
  64. data/lib/curation_concerns/models.rb +5 -14
  65. data/lib/curation_concerns/models/engine.rb +0 -30
  66. data/lib/curation_concerns/models/utils.rb +4 -4
  67. data/lib/curation_concerns/models/version.rb +1 -1
  68. data/lib/generators/curation_concerns/models/abstract_migration_generator.rb +8 -7
  69. data/lib/generators/curation_concerns/models/clamav_generator.rb +3 -3
  70. data/lib/generators/curation_concerns/models/install_generator.rb +13 -20
  71. data/lib/generators/curation_concerns/models/templates/app/models/file_set.rb +4 -0
  72. data/lib/generators/curation_concerns/models/templates/config/clamav.rb +1 -1
  73. data/lib/generators/curation_concerns/models/templates/config/curation_concerns.rb +52 -65
  74. data/lib/generators/curation_concerns/models/templates/config/redis_config.rb +13 -17
  75. data/lib/generators/curation_concerns/models/templates/config/resque_config.rb +2 -1
  76. data/lib/generators/curation_concerns/models/templates/migrations/create_checksum_audit_logs.rb +3 -3
  77. data/lib/generators/curation_concerns/models/templates/migrations/create_single_use_links.rb +12 -0
  78. data/lib/tasks/curation_concerns-models_tasks.rake +4 -62
  79. data/lib/tasks/migrate.rake +1 -1
  80. data/lib/tasks/resque.rake +1 -0
  81. data/lib/tasks/solr_reindex.rake +1 -1
  82. metadata +59 -52
  83. data/app/actors/curation_concerns/generic_file_actor.rb +0 -150
  84. data/app/jobs/active_fedora_pid_based_job.rb +0 -6
  85. data/app/jobs/copy_permissions_job.rb +0 -24
  86. data/app/models/concerns/curation_concerns/generic_file/characterization.rb +0 -89
  87. data/app/models/concerns/curation_concerns/generic_file/content.rb +0 -8
  88. data/app/models/concerns/curation_concerns/generic_file/export.rb +0 -343
  89. data/app/models/concerns/curation_concerns/generic_file_behavior.rb +0 -44
  90. data/app/models/concerns/curation_concerns/with_basic_metadata.rb +0 -98
  91. data/app/models/concerns/curation_concerns/with_generic_files.rb +0 -29
  92. data/app/models/datastreams/fits_datastream.rb +0 -148
  93. data/app/services/curation_concerns/characterization_service.rb +0 -71
  94. data/app/services/curation_concerns/full_text_extraction_service.rb +0 -38
  95. data/app/services/curation_concerns/generic_file_indexing_service.rb +0 -14
  96. data/lib/curation_concerns/models/resque.rb +0 -36
  97. data/lib/generators/curation_concerns/models/fulltext_generator.rb +0 -28
  98. data/lib/generators/curation_concerns/models/templates/app/models/generic_file.rb +0 -4
  99. data/lib/generators/curation_concerns/models/templates/config/resque_admin.rb +0 -10
@@ -1,88 +1,85 @@
1
-
2
1
  module CurationConcerns::WorkActorBehavior
3
2
  include CurationConcerns::ManagesEmbargoesActor
3
+ attr_accessor :raw_attributes
4
4
 
5
5
  def create
6
6
  # set the @files ivar then remove the files attribute so it isn't set by default.
7
7
  files && attributes.delete(:files)
8
+ self.raw_attributes = attributes.dup
8
9
  # Files must be attached before saving in order to persist their relationship to the work
9
- assign_pid && interpret_visibility && attach_files && super && assign_representative && copy_visibility
10
+ assign_pid && interpret_visibility && attach_files && super && assign_representative
10
11
  end
11
12
 
12
13
  def update
13
14
  add_to_collections(attributes.delete(:collection_ids)) &&
14
- interpret_visibility && super && attach_files && copy_visibility
15
+ interpret_visibility && super && attach_files
15
16
  end
16
17
 
17
18
  delegate :visibility_changed?, to: :curation_concern
18
19
 
19
20
  protected
20
21
 
21
- # Is this here to ensure that the curation_concern has a pid set before any of the other methods are executed?
22
- def assign_pid
23
- curation_concern.send(:assign_id)
24
- end
25
-
26
- def files
27
- return @files if defined?(@files)
28
- @files = [attributes[:files]].flatten.compact
29
- end
22
+ # Is this here to ensure that the curation_concern has a pid set before any of the other methods are executed?
23
+ def assign_pid
24
+ curation_concern.send(:assign_id)
25
+ end
30
26
 
31
- def attach_files
32
- files.all? do |file|
33
- attach_file(file)
27
+ def files
28
+ return @files if defined?(@files)
29
+ @files = [attributes[:files]].flatten.compact
34
30
  end
35
- end
36
31
 
37
- # The default behavior of active_fedora's aggregates association,
38
- # when assigning the id accessor (e.g. collection_ids = ['foo:1']) is to add
39
- # to new collections, but not remove from old collections.
40
- # This method ensures it's removed from the old collections.
41
- def add_to_collections(new_collection_ids)
42
- return true unless new_collection_ids
43
- # remove from old collections
44
- # TODO Implement parent_collection_ids https://github.com/projecthydra-labs/hydra-pcdm/issues/157
45
- (curation_concern.parent_collections.map(&:id) - new_collection_ids).each do |old_id|
46
- Collection.find(old_id).members.delete(curation_concern)
32
+ def attach_files
33
+ files.all? do |file|
34
+ attach_file(file)
35
+ end
47
36
  end
48
37
 
49
- #add to new
50
- new_collection_ids.each do |coll_id|
51
- collection = Collection.find(coll_id)
52
- collection.members << curation_concern
53
- collection.save
38
+ # The default behavior of active_fedora's aggregates association,
39
+ # when assigning the id accessor (e.g. collection_ids = ['foo:1']) is to add
40
+ # to new collections, but not remove from old collections.
41
+ # This method ensures it's removed from the old collections.
42
+ def add_to_collections(new_collection_ids)
43
+ return true unless new_collection_ids
44
+ # remove from old collections
45
+ # TODO: Implement in_collection_ids https://github.com/projecthydra-labs/hydra-pcdm/issues/157
46
+ (curation_concern.in_collections.map(&:id) - new_collection_ids).each do |old_id|
47
+ collection = Collection.find(old_id)
48
+ collection.members.delete(curation_concern)
49
+ collection.save
50
+ end
51
+
52
+ # add to new
53
+ new_collection_ids.each do |coll_id|
54
+ collection = Collection.find(coll_id)
55
+ collection.members << curation_concern
56
+ collection.save
57
+ end
58
+ true
54
59
  end
55
- true
56
- end
57
60
 
58
- def assign_representative
59
- @generic_files ||= []
60
- unless curation_concern.representative
61
- curation_concern.representative = @generic_files.first.id unless @generic_files.empty?
61
+ def assign_representative
62
+ @file_sets ||= []
63
+ unless curation_concern.representative_id
64
+ curation_concern.representative = @file_sets.first unless @file_sets.empty?
65
+ end
66
+ curation_concern.save
62
67
  end
63
- curation_concern.save
64
- end
65
68
 
66
69
  private
67
70
 
68
- def attach_file(file)
69
- generic_file = ::GenericFile.new
70
- generic_file_actor = CurationConcerns::GenericFileActor.new(generic_file, user)
71
- #TODO we're passing an ID rather than an object. This means the actor does an unnecessary lookup
72
- generic_file_actor.create_metadata(curation_concern.id, curation_concern.id)
73
- generic_file.visibility = visibility
74
- generic_file_actor.create_content(file)
75
- @generic_files ||= []
76
- @generic_files << generic_file # This is so that other methods like assign_representative can access the generic_files wihtout reloading them from fedora
77
- curation_concern.generic_files << generic_file
78
- end
79
-
80
- def valid_file?(file_path)
81
- return file_path.present? && File.exists?(file_path) && !File.zero?(file_path)
82
- end
71
+ def attach_file(file)
72
+ file_set = ::FileSet.new
73
+ file_set_actor = CurationConcerns::FileSetActor.new(file_set, user)
74
+ file_set_actor.create_metadata(curation_concern.id, curation_concern, visibility_attributes)
75
+ file_set_actor.create_content(file)
76
+ @file_sets ||= []
77
+ @file_sets << file_set # This is so that other methods like assign_representative can access the file_sets without reloading them from fedora
78
+ end
83
79
 
84
- # The path of the fedora node where we store the file data
85
- def file_path
86
- 'content'
87
- end
80
+ # The attributes used for visibility - used to send as initial params to
81
+ # created FileSets.
82
+ def visibility_attributes
83
+ raw_attributes.slice(:visibility, :visibility_during_lease, :visibility_after_lease, :lease_expiration_date, :embargo_release_date, :visibility_during_embargo, :visibility_after_embargo)
84
+ end
88
85
  end
@@ -0,0 +1,10 @@
1
+ module CurationConcerns
2
+ class CollectionIndexer < Hydra::PCDM::CollectionIndexer
3
+ def generate_solr_document
4
+ super.tap do |solr_doc|
5
+ # Makes Collections show under the "Collections" tab
6
+ Solrizer.set_field(solr_doc, 'generic_type', 'Collection', :facetable)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,24 @@
1
+ module CurationConcerns
2
+ class FileSetIndexingService < ActiveFedora::IndexingService
3
+ include IndexesThumbnails
4
+
5
+ def generate_solr_document
6
+ super.tap do |solr_doc|
7
+ solr_doc[Solrizer.solr_name('hasRelatedMediaFragment', :symbol)] = object.representative_id
8
+ solr_doc[Solrizer.solr_name('hasRelatedImage', :symbol)] = object.thumbnail_id
9
+ # Label is the actual file name. It's not editable by the user.
10
+ solr_doc[Solrizer.solr_name('label')] = object.label
11
+ solr_doc[Solrizer.solr_name('label', :stored_sortable)] = object.label
12
+ solr_doc[Solrizer.solr_name('file_format')] = object.file_format
13
+ solr_doc[Solrizer.solr_name('file_format', :facetable)] = object.file_format
14
+ solr_doc[Solrizer.solr_name(:file_size, :symbol)] = object.file_size[0]
15
+ solr_doc['all_text_timv'] = object.full_text.content
16
+ solr_doc[Solrizer.solr_name('generic_work_ids', :symbol)] = object.generic_work_ids unless object.generic_work_ids.empty?
17
+ solr_doc['height_is'] = Integer(object.height.first) if object.height.present?
18
+ solr_doc['width_is'] = Integer(object.width.first) if object.width.present?
19
+ solr_doc[Solrizer.solr_name('mime_type', :stored_sortable)] = object.mime_type
20
+ solr_doc['thumbnail_path_ss'] = thumbnail_path
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,16 +1,16 @@
1
1
  module CurationConcerns
2
- class GenericWorkIndexingService < ActiveFedora::IndexingService
3
-
2
+ class WorkIndexingService < ActiveFedora::IndexingService
3
+ include IndexesThumbnails
4
4
  def generate_solr_document
5
5
  super.tap do |solr_doc|
6
6
  # We know that all the members of GenericWorks are GenericFiles so we can use
7
- # member_ids which requires fewer Fedora API calls than generic_file_ids.
8
- # generic_file_ids requires loading all the members from Fedora but member_ids
7
+ # member_ids which requires fewer Fedora API calls than file_set_ids.
8
+ # file_set_ids requires loading all the members from Fedora but member_ids
9
9
  # looks just at solr
10
- solr_doc[Solrizer.solr_name('generic_file_ids', :symbol)] = object.member_ids
10
+ solr_doc[Solrizer.solr_name('file_set_ids', :symbol)] = object.member_ids
11
11
  Solrizer.set_field(solr_doc, 'generic_type', 'Work', :facetable)
12
+ solr_doc['thumbnail_path_ss'] = thumbnail_path
12
13
  end
13
14
  end
14
-
15
15
  end
16
16
  end
@@ -1,22 +1,15 @@
1
- class ActiveFedoraIdBasedJob
2
- def queue_name
3
- :id_based
4
- end
1
+ class ActiveFedoraIdBasedJob < ActiveJob::Base
2
+ queue_as :id_based
5
3
 
6
4
  attr_accessor :id
7
5
 
8
- def initialize(id)
9
- self.id = id
10
- end
11
-
12
6
  def object
13
7
  @object ||= ActiveFedora::Base.find(id)
14
8
  end
15
9
 
16
- alias_method :generic_file, :object
17
- alias_method :generic_file_id, :id
10
+ alias_method :file_set, :object
18
11
 
19
- def run
20
- raise RuntimeError, "Define #run in a subclass"
12
+ def perform(_)
13
+ fail 'Define #run in a subclass'
21
14
  end
22
15
  end
@@ -1,7 +1,5 @@
1
1
  class AuditJob < ActiveFedoraIdBasedJob
2
- def queue_name
3
- :audit
4
- end
2
+ queue_as :audit
5
3
 
6
4
  attr_accessor :uri, :id, :file_id
7
5
 
@@ -13,21 +11,17 @@ class AuditJob < ActiveFedoraIdBasedJob
13
11
  # @param [String] id of the parent object
14
12
  # @param [String] file_id used to find the file within its parent object (usually "original_file")
15
13
  # @param [String] uri of the specific file/version to be audited
16
- def initialize(id, file_id, uri)
17
- super(id)
18
- self.file_id = file_id
19
- self.uri = uri
20
- end
21
-
22
- def run
23
- fixity_ok = false
14
+ def perform(id, file_id, uri)
15
+ @id = id
16
+ @file_id = file_id
17
+ @uri = uri
24
18
  log = run_audit
25
- fixity_ok = (log.pass == 1)
19
+ fixity_ok = log.pass == 1
26
20
  unless fixity_ok
27
- if CurationConcerns.config.respond_to?(:after_audit_failure)
28
- login = generic_file.depositor
21
+ if CurationConcerns.config.callback.set?(:after_audit_failure)
22
+ login = file_set.depositor
29
23
  user = User.find_by_user_key(login)
30
- CurationConcerns.config.after_audit_failure.call(generic_file, user, log.created_at)
24
+ CurationConcerns.config.callback.run(:after_audit_failure, file_set, user, log.created_at)
31
25
  end
32
26
  end
33
27
  fixity_ok
@@ -39,7 +33,7 @@ class AuditJob < ActiveFedoraIdBasedJob
39
33
  begin
40
34
  fixity_ok = ActiveFedora::FixityService.new(uri).check
41
35
  rescue Ldp::NotFound
42
- error_msg = "resource not found"
36
+ error_msg = 'resource not found'
43
37
  end
44
38
 
45
39
  if fixity_ok
@@ -49,7 +43,7 @@ class AuditJob < ActiveFedoraIdBasedJob
49
43
  logger.warn "***AUDIT*** Audit failed for #{uri} #{error_msg}"
50
44
  passing = 0
51
45
  end
52
- ChecksumAuditLog.create!(pass: passing, generic_file_id: id, version: uri, file_id: file_id)
46
+ ChecksumAuditLog.create!(pass: passing, file_set_id: id, version: uri, file_id: file_id)
53
47
  end
54
48
 
55
49
  def logger
@@ -1,11 +1,12 @@
1
1
  class CharacterizeJob < ActiveFedoraIdBasedJob
2
- def queue_name
3
- :characterize
4
- end
2
+ queue_as :characterize
5
3
 
6
- def run
7
- CurationConcerns::CharacterizationService.run(generic_file)
8
- generic_file.save
9
- CurationConcerns.queue.push(CreateDerivativesJob.new(generic_file.id))
4
+ # @param [String] id
5
+ # @param [String] filename a local path for the file to characterize. By using this, we don't have to pull a copy out of fedora.
6
+ def perform(id, filename)
7
+ @id = id
8
+ Hydra::Works::CharacterizationService.run(file_set, filename)
9
+ file_set.save
10
+ CreateDerivativesJob.perform_later(file_set.id, filename)
10
11
  end
11
12
  end
@@ -1,15 +1,12 @@
1
1
  class CreateDerivativesJob < ActiveFedoraIdBasedJob
2
- def queue_name
3
- :derivatives
4
- end
2
+ queue_as :derivatives
3
+
4
+ def perform(id, file_name)
5
+ @id = id
6
+ return if file_set.video? && !CurationConcerns.config.enable_ffmpeg
5
7
 
6
- def run
7
- return unless generic_file.original_file.has_content?
8
- if generic_file.video?
9
- return unless CurationConcerns.config.enable_ffmpeg
10
- end
11
-
12
- generic_file.create_derivatives
13
- generic_file.save
8
+ file_set.create_derivatives(file_name)
9
+ # The thumbnail is indexed in the solr document, so reindex
10
+ file_set.update_index
14
11
  end
15
12
  end
@@ -3,39 +3,30 @@ require 'uri'
3
3
  require 'tempfile'
4
4
 
5
5
  class ImportUrlJob < ActiveFedoraIdBasedJob
6
+ queue_as :import_url
6
7
 
7
- def queue_name
8
- :import_url
9
- end
10
-
11
- def run
12
- user = User.find_by_user_key(generic_file.depositor)
8
+ def perform(id)
9
+ @id = id
10
+ user = User.find_by_user_key(file_set.depositor)
13
11
 
14
- Tempfile.open(id.gsub('/', '_')) do |f|
15
- copy_remote_file(generic_file.import_url, f)
12
+ Tempfile.open(id.tr('/', '_')) do |f|
13
+ copy_remote_file(file_set.import_url, f)
16
14
  # attach downloaded file to generic file stubbed out
17
- if CurationConcerns::GenericFileActor.new(generic_file, user).create_content(f)
18
-
15
+ if CurationConcerns::FileSetActor.new(file_set, user).create_content(f)
19
16
  # send message to user on download success
20
- if CurationConcerns.config.respond_to?(:after_import_url_success)
21
- CurationConcerns.config.after_import_url_success.call(generic_file, user)
22
- end
17
+ CurationConcerns.config.callback.run(:after_import_url_success, file_set, user)
23
18
  else
24
-
25
- # send message to user on download failure
26
- if CurationConcerns.config.respond_to?(:after_import_url_failure)
27
- CurationConcerns.config.after_import_url_failure.call(generic_file, user)
28
- end
19
+ CurationConcerns.config.callback.run(:after_import_url_failure, file_set, user)
29
20
  end
30
21
  end
31
22
  end
32
23
 
33
- def copy_remote_file(import_url, f)
24
+ def copy_remote_file(_import_url, f)
34
25
  f.binmode
35
26
  # download file from url
36
- uri = URI(generic_file.import_url)
27
+ uri = URI(file_set.import_url)
37
28
  http = Net::HTTP.new(uri.host, uri.port)
38
- http.use_ssl = uri.scheme == "https" # enable SSL/TLS
29
+ http.use_ssl = uri.scheme == 'https' # enable SSL/TLS
39
30
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
40
31
  mime_type = nil
41
32
 
@@ -49,8 +40,4 @@ class ImportUrlJob < ActiveFedoraIdBasedJob
49
40
  end
50
41
  f.rewind
51
42
  end
52
-
53
- def job_user
54
- User.batchuser
55
- end
56
43
  end
@@ -0,0 +1,16 @@
1
+ class IngestFileJob < ActiveJob::Base
2
+ queue_as :ingest
3
+
4
+ def perform(file_set_id, filename, mime_type, user_key)
5
+ file_set = FileSet.find(file_set_id)
6
+ file = Hydra::Derivatives::IoDecorator.new(File.open(filename, "rb"))
7
+ file.mime_type = mime_type
8
+ file.original_name = File.basename(filename)
9
+
10
+ # Tell UploadFileToGenericFile service to skip versioning because versions will be minted by VersionCommitter (called by save_characterize_and_record_committer) when necessary
11
+ Hydra::Works::UploadFileToFileSet.call(file_set, file, versioning: false)
12
+ file_set.save!
13
+ CurationConcerns::VersioningService.create(file_set.original_file, user_key)
14
+ CurationConcerns.config.callback.run(:after_create_content, file_set, user_key)
15
+ end
16
+ end
@@ -1,48 +1,27 @@
1
- class IngestLocalFileJob
2
- attr_accessor :directory, :filename, :user_key, :generic_file_id
1
+ class IngestLocalFileJob < ActiveJob::Base
2
+ attr_accessor :directory, :filename, :user_key, :file_set_id
3
3
 
4
- def queue_name
5
- :ingest
6
- end
4
+ queue_as :ingest_local
7
5
 
8
- def initialize(generic_file_id, directory, filename, user_key)
9
- self.generic_file_id = generic_file_id
10
- self.directory = directory
11
- self.filename = filename
12
- self.user_key = user_key
13
- end
6
+ def perform(file_set_id, directory, filename, user_key)
7
+ @file_set_id = file_set_id
8
+ @directory = directory
9
+ @filename = filename
10
+ @user_key = user_key
14
11
 
15
- def run
16
12
  user = User.find_by_user_key(user_key)
17
- raise "Unable to find user for #{user_key}" unless user
18
- generic_file = GenericFile.find(generic_file_id)
19
- generic_file.label ||= filename
13
+ fail "Unable to find user for #{user_key}" unless user
14
+ file_set = FileSet.find(file_set_id)
15
+ file_set.label ||= filename
20
16
  path = File.join(directory, filename)
21
17
 
22
- actor = CurationConcerns::GenericFileActor.new(generic_file, user)
18
+ actor = CurationConcerns::FileSetActor.new(file_set, user)
23
19
 
24
20
  if actor.create_content(File.open(path))
25
21
  FileUtils.rm(path)
26
-
27
- # send message to user on import success
28
- if CurationConcerns.config.respond_to?(:after_import_local_file_success)
29
- CurationConcerns.config.after_import_local_file_success.call(generic_file, user, filename)
30
- end
22
+ CurationConcerns.config.callback.run(:after_import_local_file_success, file_set, user, filename)
31
23
  else
32
-
33
- # send message to user on import failure
34
- if CurationConcerns.config.respond_to?(:after_import_local_file_failure)
35
- CurationConcerns.config.after_import_local_file_failure.call(generic_file, user, filename)
36
- end
24
+ CurationConcerns.config.callback.run(:after_import_local_file_failure, file_set, user, filename)
37
25
  end
38
26
  end
39
-
40
- def job_user
41
- User.batchuser
42
- end
43
-
44
- def mime_type(file_name)
45
- mime_types = MIME::Types.of(file_name)
46
- mime_types.empty? ? "application/octet-stream" : mime_types.first.content_type
47
- end
48
27
  end