Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Start Canvas #882

Merged
merged 2 commits into from
Mar 8, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion app/services/manifest_builder/manifest_service_locator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ def record_property_builder
ManifestBuilder::RecordPropertyBuilder
end

def start_canvas_builder
IIIFManifest::ManifestServiceLocator::InjectedFactory.new(
::ManifestBuilder::StartCanvasBuilder,
canvas_builder: canvas_builder
)
end

##
# Objects are either in 'manifests' or 'collections' depending on if the
# child resource is a IIIF::Manifest or a IIIF::Collection. This special
Expand Down Expand Up @@ -109,7 +116,8 @@ def sequence_builder
IIIFManifest::ManifestServiceLocator::InjectedFactory.new(
::ManifestBuilder::SequenceBuilder, # This whole method is overridden just for this constant.
canvas_builder_factory: canvas_builder_factory,
sequence_factory: sequence_factory
sequence_factory: sequence_factory,
start_canvas_builder: start_canvas_builder
)
end

Expand Down
7 changes: 7 additions & 0 deletions app/services/manifest_builder/sequence_builder.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
# frozen_string_literal: true
class ManifestBuilder
class SequenceBuilder < IIIFManifest::ManifestBuilder::SequenceBuilder
attr_reader :start_canvas_builder
def initialize(work, canvas_builder_factory:, sequence_factory:, start_canvas_builder:)
super(work, canvas_builder_factory: canvas_builder_factory, sequence_factory: sequence_factory)
@start_canvas_builder = start_canvas_builder
end

def apply(manifest)
sequence["viewingHint"] = manifest["viewingHint"]
start_canvas_builder.new(work).apply(sequence)
super
end
end
Expand Down
38 changes: 38 additions & 0 deletions app/services/manifest_builder/start_canvas_builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# frozen_string_literal: true
class ManifestBuilder
class StartCanvasBuilder
attr_reader :resource, :canvas_builder

# @param [Valhalla::Resource] resource the Resource being viewed
def initialize(resource, canvas_builder:)
@resource = resource
@canvas_builder = canvas_builder
end

def apply(manifest)
return manifest unless start_canvas_id && file_set
manifest['startCanvas'] = path
manifest
end

private

def path
canvas_builder.new(file_set, resource).path
end

def file_set
@file_set ||= query_service.find_by(id: start_canvas_id)
rescue Valkyrie::Persistence::ObjectNotFoundError
nil
end

def query_service
Valkyrie.config.metadata_adapter.query_service
end

def start_canvas_id
Array.wrap(resource.resource.try(:start_canvas)).first
end
end
end
13 changes: 12 additions & 1 deletion spec/services/manifest_builder_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
let(:metadata_adapter) { Valkyrie.config.metadata_adapter }
let(:query_service) { metadata_adapter.query_service }
let(:file) { fixture_file_upload('files/example.tif', 'image/tiff') }
let(:start_canvas) { nil }

def logical_structure(file_set_id)
[
Expand Down Expand Up @@ -61,7 +62,7 @@ def logical_structure(file_set_id)
file_set.local_identifier = "p79409x97p"
metadata_adapter.persister.save(resource: file_set)
change_set = ScannedResourceChangeSet.new(output)
change_set.validate(logical_structure: logical_structure(file_set_id))
change_set.validate(logical_structure: logical_structure(file_set_id), start_canvas: start_canvas || file_set_id)
change_set.sync
change_set_persister.save(change_set: change_set)
end
Expand Down Expand Up @@ -92,6 +93,7 @@ def logical_structure(file_set_id)
expect(output["thumbnail"]).not_to be_blank
expect(output["thumbnail"]["@id"]).to eq "#{first_image['resource']['service']['@id']}/full/!200,150/0/default.jpg"
expect(output["thumbnail"]["service"]["@id"]).to eq first_image["resource"]["service"]["@id"]
expect(output["sequences"][0]["startCanvas"]).to eq canvas_id
end

context "when there's no derivative_file" do
Expand Down Expand Up @@ -129,6 +131,15 @@ def logical_structure(file_set_id)
end
end

context "when a start_canvas doesn't exist" do
let(:start_canvas) { Valkyrie::ID.new("blablabla") }
it "doesn't set a startCanvas" do
output = manifest_builder.build
first_sequence = output["sequences"][0]
expect(first_sequence["startCanvas"]).to be_nil
end
end

context "when in staging" do
it "generates cantaloupe links" do
allow(Rails.env).to receive(:development?).and_return(false)
Expand Down