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.
-
#initialize(work:, persister: Hyrax.persister) ⇒ WorkUploadsHandler
constructor
A new instance of WorkUploadsHandler.
Methods included from Lockable
#acquire_lock_for, #lock_manager
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.
76 77 78 79 80 81 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 76 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
89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'app/services/hyrax/work_uploads_handler.rb', line 89 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([]) { |file, arry| arry << make_file_set_and_ingest(file) } @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 |