diff --git a/app/models/embed/purl_json_loader.rb b/app/models/embed/purl_json_loader.rb index 8e3d4bee7..bfcfaea12 100644 --- a/app/models/embed/purl_json_loader.rb +++ b/app/models/embed/purl_json_loader.rb @@ -90,9 +90,24 @@ def embargo_release_date end def contents - # NOTE: collections don't have structural.contains + # NOTE: collections don't have structural + return [] unless json['structural'] + Array(json.dig('structural', 'contains')).map do |file_set_json| Purl::ResourceJsonDeserializer.new(@druid, file_set_json).deserialize + end + external_resources(Array(json.dig('structural', 'hasMemberOrders', 0, 'members'))) + end + + def external_resources(identifiers) + identifiers.map do |identifier| + druid = identifier.delete_prefix('druid:') + component = Embed::Purl.find(druid) + Purl::Resource.new( + druid: druid, + type: component.type, + description: component.title, + files: [] + ) end end diff --git a/app/viewers/embed/viewer_factory.rb b/app/viewers/embed/viewer_factory.rb index 9783296a8..5381e8f6a 100644 --- a/app/viewers/embed/viewer_factory.rb +++ b/app/viewers/embed/viewer_factory.rb @@ -2,6 +2,7 @@ module Embed class ViewerFactory + # @param [Embed::Request] request def initialize(embed_request) @embed_request = embed_request raise Embed::Purl::ResourceNotEmbeddable unless embed_request.purl_object.valid? diff --git a/lib/embed/request.rb b/lib/embed/request.rb index 875d4da3e..bebbded0b 100644 --- a/lib/embed/request.rb +++ b/lib/embed/request.rb @@ -58,6 +58,7 @@ def object_druid url[/\w*$/] end + # @return [Embed::Purl] def purl_object @purl_object ||= Purl.find(object_druid) end diff --git a/lib/embed/response.rb b/lib/embed/response.rb index 9ad45cd8f..e802eba6f 100644 --- a/lib/embed/response.rb +++ b/lib/embed/response.rb @@ -5,6 +5,8 @@ class Response attr_reader :request delegate :height, :width, to: :viewer + + # @param [Embed::Request] request def initialize(request) @request = request end diff --git a/spec/fixtures/purl_fixtures.rb b/spec/fixtures/purl_fixtures.rb index 826fa2f1b..d2fc0db27 100644 --- a/spec/fixtures/purl_fixtures.rb +++ b/spec/fixtures/purl_fixtures.rb @@ -82,6 +82,37 @@ def file_purl_json JSON end + def virtual_object_purl_json + <<~JSON + { + "type": "https://cocina.sul.stanford.edu/models/object", + "label": "File Title", + "description": { + "title": [ + { + "value": "File Title" + } + ] + }, + "access": { + "view": "world", + "download": "world", + "license": "https://creativecommons.org/publicdomain/mark/1.0/" + }, + "structural": { + "contains": [], + "hasMemberOrders": [ + { + "members": [ + "druid:kq126jw7402" + ] + } + ] + } + } + JSON + end + def collection_purl_json <<~JSON { diff --git a/spec/models/embed/purl_json_loader_spec.rb b/spec/models/embed/purl_json_loader_spec.rb index 68c184671..1995c351b 100644 --- a/spec/models/embed/purl_json_loader_spec.rb +++ b/spec/models/embed/purl_json_loader_spec.rb @@ -63,6 +63,18 @@ end end + context 'with a virtual object' do + let(:json) { virtual_object_purl_json } + let(:associate) { Embed::Purl.new } + before do + allow(Embed::Purl).to receive(:find).with('kq126jw7402').and_return(associate) + end + + it 'has contents' do + expect(data[:contents].first.druid).to eq 'kq126jw7402' + end + end + describe 'license' do context 'with a creative commons license' do let(:json) { file_purl_json }