From 64b2e9b867ceb97ee1d3aaabcd6c57a33305d4ef Mon Sep 17 00:00:00 2001 From: Justin Coyne Date: Fri, 17 Nov 2023 16:26:32 -0600 Subject: [PATCH] Resolve rights values early --- .../embed/purl/file_xml_deserializer.rb | 32 ++++++++++++++++--- app/models/embed/purl/resource_file.rb | 20 +++--------- .../embed/purl/file_xml_deserializer_spec.rb | 7 +++- .../purl/resource_xml_deserializer_spec.rb | 8 ++++- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/app/models/embed/purl/file_xml_deserializer.rb b/app/models/embed/purl/file_xml_deserializer.rb index 03b251cdd..353a10b3a 100644 --- a/app/models/embed/purl/file_xml_deserializer.rb +++ b/app/models/embed/purl/file_xml_deserializer.rb @@ -14,18 +14,40 @@ def initialize(druid, description, file, rights) @rights = rights end + def filename + @filename ||= @file.attributes['id'].value + end + + def stanford_only + @rights.stanford_only_rights_for_file(filename).first + end + + def location_restricted + @rights.restricted_by_location?(filename) + end + + def world_downloadable + @rights.world_downloadable_file?(filename) + end + + def duration + return if @file.xpath('./*/@duration').blank? + + Embed::MediaDuration.new(@file.xpath('./*[@duration]').first).to_s + end + def deserialize ResourceFile.new( druid: @druid, label: @description, - filename: @file.attributes['id'].value, mimetype: @file.attributes['mimetype']&.value, size: @file.attributes['size']&.value.to_i, - rights: @rights + filename:, + stanford_only:, + location_restricted:, + world_downloadable: ) do |file| - if @file.xpath('./*/@duration').present? - file.duration = Embed::MediaDuration.new(@file.xpath('./*[@duration]').first).to_s - end + file.duration = duration end end end diff --git a/app/models/embed/purl/resource_file.rb b/app/models/embed/purl/resource_file.rb index ddfb0d3e2..f6ae96fc0 100644 --- a/app/models/embed/purl/resource_file.rb +++ b/app/models/embed/purl/resource_file.rb @@ -14,9 +14,13 @@ def attributes=(hash) end end - attr_accessor :druid, :label, :filename, :mimetype, :size, :duration, :rights + attr_accessor :druid, :label, :filename, :mimetype, :size, :duration, + :world_downloadable, :stanford_only, :location_restricted alias title filename + alias world_downloadable? world_downloadable + alias stanford_only? stanford_only + alias location_restricted? location_restricted ## # Creates a file url for stacks @@ -49,20 +53,6 @@ def pdf? def image? mimetype =~ %r{image/jp2}i end - - def stanford_only? - value, _rule = @rights.stanford_only_rights_for_file(title) - - value - end - - def location_restricted? - @rights.restricted_by_location?(title) - end - - def world_downloadable? - @rights.world_downloadable_file?(title) - end end end end diff --git a/spec/models/embed/purl/file_xml_deserializer_spec.rb b/spec/models/embed/purl/file_xml_deserializer_spec.rb index b5a642858..9513746c9 100644 --- a/spec/models/embed/purl/file_xml_deserializer_spec.rb +++ b/spec/models/embed/purl/file_xml_deserializer_spec.rb @@ -11,8 +11,13 @@ XML ).root end + let(:rights) do + instance_double(Dor::RightsAuth, stanford_only_rights_for_file: [false, nil], + restricted_by_location?: false, + world_downloadable_file?: true) + end - let(:resource_file) { described_class.new('abc123', 'desc', file_node, nil).deserialize } + let(:resource_file) { described_class.new('abc123', 'desc', file_node, rights).deserialize } it 'creates a resource file' do expect(resource_file.druid).to eq 'abc123' diff --git a/spec/models/embed/purl/resource_xml_deserializer_spec.rb b/spec/models/embed/purl/resource_xml_deserializer_spec.rb index 8296727c4..794d5f4c9 100644 --- a/spec/models/embed/purl/resource_xml_deserializer_spec.rb +++ b/spec/models/embed/purl/resource_xml_deserializer_spec.rb @@ -16,7 +16,13 @@ ).xpath('//resource').first end - let(:resource) { described_class.new('abc123', resource_element, nil).deserialize } + let(:rights) do + instance_double(Dor::RightsAuth, stanford_only_rights_for_file: [false, nil], + restricted_by_location?: false, + world_downloadable_file?: true) + end + + let(:resource) { described_class.new('abc123', resource_element, rights).deserialize } it 'creates a resource' do expect(resource.druid).to eq 'abc123'