curation_concerns-models 0.1.0 → 0.2.0

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