Class: AtlasRb::Work
Overview
The bibliographic unit in Atlas — an article, thesis, dataset, image, etc.
A Work belongs to exactly one Collection and aggregates one or more FileSets, each of which holds binary content via a Blob. MODS metadata is attached at the Work level.
See also: Collection, FileSet, Blob.
Constant Summary collapse
- ROUTE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Atlas REST endpoint prefix for this resource.
"/works/"
Class Method Summary collapse
-
.complete(id, nuid: nil) ⇒ Faraday::Response
Mark a Work complete.
-
.create(id, xml_path = nil, idempotency_key: nil) ⇒ Hash
Create a new Work in an existing Collection.
-
.destroy(id) ⇒ Faraday::Response
Delete a Work.
- .files(id) ⇒ Array<AtlasRb::Mash>
-
.find(id) ⇒ Hash
Fetch a single Work by ID.
-
.list(in_progress: nil, page: nil, per_page: nil) ⇒ AtlasRb::Mash
List Works, paginated.
-
.metadata(id, values) ⇒ Hash
Patch individual metadata fields without uploading a full MODS document.
-
.mods(id, kind = nil) ⇒ String
Fetch the Work's MODS representation in the requested format.
-
.restore(id, nuid:) ⇒ Faraday::Response
Restore a previously tombstoned Work.
-
.tombstone(id, nuid:) ⇒ Faraday::Response
Tombstone (withdraw) a Work.
-
.update(id, xml_path) ⇒ Hash
Replace a Work's metadata by uploading a MODS XML document.
Methods inherited from Resource
Methods included from FaradayHelper
Class Method Details
.complete(id, nuid: nil) ⇒ Faraday::Response
Mark a Work complete.
Cerberus's bulk-deposit job calls this once it has confirmed all
expected children (FileSets / Blobs) are deposited. Atlas's monitoring
query GET /works?in_progress=true then drops this Work from the
"stuck" list.
Idempotent on the server: calling complete on an already-complete
Work is a no-op — Atlas simply re-saves with in_progress: false.
Atlas does not currently stamp a completed_by audit field; the
nuid: parameter is plumbed through for parity with the other
lifecycle bindings and in case Atlas adds completion audit later.
145 146 147 |
# File 'lib/atlas_rb/work.rb', line 145 def self.complete(id, nuid: nil) connection({}, nuid).post(ROUTE + id + '/complete') end |
.create(id, xml_path = nil, idempotency_key: nil) ⇒ Hash
Create a new Work in an existing Collection.
Note: unlike Community.create and Collection.create, the id
parameter here is the parent Collection ID. The underlying request
uses the collection_id query param rather than parent_id.
86 87 88 89 90 91 92 93 94 |
# File 'lib/atlas_rb/work.rb', line 86 def self.create(id, xml_path = nil, idempotency_key: nil) result = AtlasRb::Mash.new(JSON.parse( connection({ collection_id: id }, nil, idempotency_key: idempotency_key).post(ROUTE)&.body ))["work"] return result unless xml_path.present? update(result["id"], xml_path) find(result["id"]) end |
.destroy(id) ⇒ Faraday::Response
Delete a Work.
103 104 105 |
# File 'lib/atlas_rb/work.rb', line 103 def self.destroy(id) connection({}).delete(ROUTE + id) end |
.files(id) ⇒ Array<AtlasRb::Mash>
203 204 205 |
# File 'lib/atlas_rb/work.rb', line 203 def self.files(id) JSON.parse(connection({}).get(ROUTE + id + '/files')&.body).map { |entry| AtlasRb::Mash.new(entry) } end |
.find(id) ⇒ Hash
Fetch a single Work by ID.
25 26 27 |
# File 'lib/atlas_rb/work.rb', line 25 def self.find(id) AtlasRb::Mash.new(JSON.parse(connection({}).get(ROUTE + id)&.body))["work"] end |
.list(in_progress: nil, page: nil, per_page: nil) ⇒ AtlasRb::Mash
List Works, paginated.
Wraps GET /works. Returns the full pagination envelope rather than a
bare array so callers can page through results — the shape matches
Community.children and Collection.children.
48 49 50 51 52 53 54 |
# File 'lib/atlas_rb/work.rb', line 48 def self.list(in_progress: nil, page: nil, per_page: nil) params = {} params[:in_progress] = in_progress unless in_progress.nil? params[:page] = page if page params[:per_page] = per_page if per_page AtlasRb::Mash.new(JSON.parse(connection(params).get(ROUTE)&.body)) end |
.metadata(id, values) ⇒ Hash
Patch individual metadata fields without uploading a full MODS document.
188 189 190 |
# File 'lib/atlas_rb/work.rb', line 188 def self.(id, values) AtlasRb::Mash.new(JSON.parse(connection({ metadata: values }).patch(ROUTE + id)&.body)) end |
.mods(id, kind = nil) ⇒ String
Fetch the Work's MODS representation in the requested format.
216 217 218 219 220 221 |
# File 'lib/atlas_rb/work.rb', line 216 def self.mods(id, kind = nil) # json default, html, xml connection({}).get( ROUTE + id + '/mods' + (kind.present? ? ".#{kind}" : '') )&.body end |
.restore(id, nuid:) ⇒ Faraday::Response
Restore a previously tombstoned Work.
Operator-only. Restoration is intentionally not exposed in any end-user UI; call this from a Rails console session (or a future admin panel) when the library has decided an object should come back.
161 162 163 |
# File 'lib/atlas_rb/work.rb', line 161 def self.restore(id, nuid:) connection({}, nuid).post(ROUTE + id + '/restore') end |
.tombstone(id, nuid:) ⇒ Faraday::Response
Tombstone (withdraw) a Work.
The Work remains in Atlas storage along with its FileSets and Blobs, but is marked as withdrawn: search and show pages return a withdrawn stub for every user. Unlike Communities and Collections, Works are always tombstoneable regardless of how many files they hold — the FileSets and Blobs ride along.
122 123 124 |
# File 'lib/atlas_rb/work.rb', line 122 def self.tombstone(id, nuid:) connection({}, nuid).post(ROUTE + id + '/tombstone') end |
.update(id, xml_path) ⇒ Hash
Replace a Work's metadata by uploading a MODS XML document.
173 174 175 176 177 178 |
# File 'lib/atlas_rb/work.rb', line 173 def self.update(id, xml_path) payload = { binary: Faraday::Multipart::FilePart.new(File.open(xml_path), "application/xml", File.basename(xml_path)) } AtlasRb::Mash.new(JSON.parse(multipart({}).patch(ROUTE + id, payload)&.body)) end |