Class: Hyrax::WorkUploadsHandler
- Inherits:
-
Object
- Object
- Hyrax::WorkUploadsHandler
- Includes:
- Lockable
- Defined in:
- app/services/hyrax/work_uploads_handler.rb
Overview
make this genuinely retry-able. if we fail after creating some of the file_sets, but not attaching them to works, we should resolve that incomplete work on subsequent runs.
Mediates uploads to a work.
Given an existing Work object, #add some set of files, then call #attach
to handle creation/attachment of File Sets, and trigger persistence of files
to the storage backend.
This class provides both an interface and a concrete implementation.
Applications that want to handle file attachment differently (e.g. by making
them completely synchronous, by attaching file sets to a different work
attribute, by supporting another file/IO class, etc...) can use a different
Handler implementation. The only guarantee made by the interface is that
the process of persisting the relationship between work and the provided
files will start when #attach is called.
This base implementation accepts only Hyrax::UploadedFile instances and,
for each one, creates a Hyrax::FileSet with permissions matching those on
work, and appends that FileSet to member_ids. The FileSet will be
added in the order that the UploadedFiles are passed in. If the work has a
nil representative_id and/or thumbnail_id, the first FileSet will be
set to that value. An IngestJob will be equeued, for each FileSet. When
all of the files have been processed, the work will be saved with the
added members. While this is happening, we take a lock on the work via
Lockable (Redis/Redlock).
This also publishes events as required by Hyrax.publisher.
Instance Attribute Summary collapse
- #file_set_params ⇒ Object readonly
- #files ⇒ Enumberable<Hyrax::UploadedFile> readonly
- #work ⇒ Hyrax::Work readonly
Instance Method Summary collapse
-
#add(files:, file_set_params: []) ⇒ WorkFileSetManager
Self.
-
#attach ⇒ Boolean
Create filesets for each added file, and add some additional metadata passed in file_set_params Additional metadata will only be set if it is not overriden by the
file_set_argshash, and if it is a valid part of the schema. -
#initialize(work:, persister: Hyrax.persister) ⇒ WorkUploadsHandler
constructor
A new instance of WorkUploadsHandler.
Methods included from Lockable
Constructor Details
#initialize(work:, persister: Hyrax.persister) ⇒ WorkUploadsHandler
Returns a new instance of WorkUploadsHandler.
58 59 60 61 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 58 def initialize(work:, persister: Hyrax.persister) @work = work @persister = persister end |
Instance Attribute Details
#file_set_params ⇒ Object (readonly)
53 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 53 attr_reader :files, :work, :file_set_params |
#files ⇒ Enumberable<Hyrax::UploadedFile> (readonly)
53 54 55 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 53 def files @files end |
#work ⇒ Hyrax::Work (readonly)
53 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 53 attr_reader :files, :work, :file_set_params |
Instance Method Details
#add(files:, file_set_params: []) ⇒ WorkFileSetManager
we immediately and silently discard uploads with an existing file_set_uri, in a half-considered attempt at supporting idempotency (for job retries). this is for legacy/AttachFilesToWorkJob compatibility, but could stand for a robust reimplementation.
Returns self.
78 79 80 81 82 83 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 78 def add(files:, file_set_params: []) validate_files(files) && @files = Array.wrap(files).reject { |f| f.file_set_uri.present? } @file_set_params = file_set_params || [] self end |
#attach ⇒ Boolean
Create filesets for each added file, and add some additional metadata passed in file_set_params
Additional metadata will only be set if it is not overriden by the file_set_args hash, and if it is a valid part of the schema
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 92 def attach return true if Array.wrap(files).empty? # short circuit to avoid aquiring a lock we won't use acquire_lock_for(work.id) do event_payloads = files.each_with_object([]).with_index do |(file, arry), index| arry << make_file_set_and_ingest(file, @file_set_params[index] || {}) end @persister.save(resource: work) Hyrax.publisher.publish('object.metadata.updated', object: work, user: files.first.user) event_payloads.each do |payload| payload.delete(:job).enqueue Hyrax.publisher.publish('file.set.attached', payload) end end end |