diff --git a/app/controllers/catalog_controller.rb b/app/controllers/catalog_controller.rb index e7c1bcc5..e70d7703 100644 --- a/app/controllers/catalog_controller.rb +++ b/app/controllers/catalog_controller.rb @@ -53,6 +53,10 @@ def unique_custom_fields config.add_search_field 'all_fields', label: 'Everything' config.add_sort_field 'relevance', sort: 'score desc', label: 'Relevance' + config.add_sort_field 'sort_title', sort: 'sort_title_ssi asc, sort_date_ssi desc', label: 'Title' + config.add_sort_field 'sort_date', sort: 'sort_date_ssi desc, sort_title_ssi asc', label: 'Date' + config.add_sort_field 'sort_author', sort: 'sort_author_ssi asc, sort_title_ssi asc', label: 'Author' + # TODO: place of publication config.add_facet_field 'spotlight_resource_type_ssim' config.index.thumbnail_field = 'thumbnail_ssim' diff --git a/app/services/iiif_manifest.rb b/app/services/iiif_manifest.rb index f2084fa0..fd168242 100644 --- a/app/services/iiif_manifest.rb +++ b/app/services/iiif_manifest.rb @@ -1,6 +1,11 @@ class IiifManifest < Spotlight::Resources::IiifManifest def to_solr add_noid + # this is called in super, but idempotent so safe to call here also; we need the metadata + add_metadata + add_sort_title + add_sort_date + add_sort_author super end @@ -8,6 +13,20 @@ def add_noid solr_hash["access_identifier_ssim"] = [noid] end + def add_sort_title + # Once we upgrade we should probably use this json_ld_value? + #solr_hash['sort_title_ssi'] = Array.wrap(json_ld_value(manifest.label)).first + solr_hash['sort_title_ssi'] = Array.wrap(manifest.label).first + end + + def add_sort_date + solr_hash['sort_date_ssi'] = Array.wrap(solr_hash['readonly_date_ssim']).first + end + + def add_sort_author + solr_hash['sort_author_ssi'] = Array.wrap(solr_hash['readonly_author_ssim']).first + end + def full_image_url return super unless manifest['thumbnail'] && manifest['thumbnail']['service'] && manifest['thumbnail']['service']['@id'] "#{manifest['thumbnail']['service']['@id']}/full/!600,600/0/default.jpg" diff --git a/spec/fixtures/iiif_responses.rb b/spec/fixtures/iiif_responses.rb new file mode 100644 index 00000000..f60bebc6 --- /dev/null +++ b/spec/fixtures/iiif_responses.rb @@ -0,0 +1,57 @@ +# pulled and pared down from spotlight +# https://github.com/projectblacklight/spotlight/blob/b4608610ed0405f1d8ed4d6c9c17a02b06b9bcf6/spec/fixtures/iiif_responses.rb +module IiifResponses + def test_manifest1 + { + "@id": 'uri://for-manifest1/manifest', + "@type": 'sc:Manifest', + "label": 'Test Manifest 1', + "attribution": 'Attribution Data', + "description": 'A test IIIF manifest', + "license": 'http://www.example.org/license.html', + "metadata": [ + { + "label": 'Author', + "value": 'John Doe' + }, + { + "label": 'Author', + "value": 'Jane Doe' + }, + { + "label": 'Another Field', + "value": 'Some data' + }, + { + "label": 'Date', + "value": '1929' + } + ], + "thumbnail": { + "@id": 'uri://to-thumbnail' + }, + "sequences": [ + { + "@type": 'sc:Sequence', + "canvases": [ + { + "@type": 'sc:Canvas', + "images": [ + { + "@type": 'oa:Annotation', + "resource": { + "@type": 'dcterms:Image', + "@id": 'uri://full-image', + "service": { + "@id": 'uri://to-image-service' + } + } + } + ] + } + ] + } + ] + }.to_json + end +end diff --git a/spec/services/iiif_manifest_spec.rb b/spec/services/iiif_manifest_spec.rb new file mode 100644 index 00000000..3b707dea --- /dev/null +++ b/spec/services/iiif_manifest_spec.rb @@ -0,0 +1,34 @@ +require 'rails_helper' + +RSpec.describe IiifManifest do + subject { described_class.new(url: url, manifest: manifest, collection: collection) } + let(:url) { 'uri://some_id/manifest' } + let(:collection) { double(compound_id: '1') } + let(:manifest_fixture) { test_manifest1 } + before do + stub_iiif_response_for_url(url, manifest_fixture) + subject.with_exhibit(exhibit) + end + + describe '#to_solr' do + let(:manifest) { IiifService.new(url).send(:object) } + let(:exhibit) { FactoryBot.create(:exhibit) } + describe 'sort_title' do + it 'is a single-value text field' do + expect(subject.to_solr["sort_title_ssi"]).to eq "Test Manifest 1" + end + end + + describe 'sort_date' do + it 'is a single-value text field' do + expect(subject.to_solr["sort_date_ssi"]).to eq "1929" + end + end + + describe 'sort_author' do + it 'is a single-value text field' do + expect(subject.to_solr["sort_author_ssi"]).to eq "John Doe" + end + end + end +end diff --git a/spec/support/stub_iiif_response.rb b/spec/support/stub_iiif_response.rb new file mode 100644 index 00000000..ab824a28 --- /dev/null +++ b/spec/support/stub_iiif_response.rb @@ -0,0 +1,19 @@ +# pulled and pared down from spotlight +# https://github.com/projectblacklight/spotlight/blob/b4608610ed0405f1d8ed4d6c9c17a02b06b9bcf6/spec/support/stub_iiif_response.rb +require 'fixtures/iiif_responses' +module StubIiifResponse + def stub_iiif_response_for_url(url, response) + allow(IiifService).to receive(:iiif_response).with(url).and_return(response) + end + + def stub_default_collection + allow_any_instance_of(Spotlight::Resources::IiifHarvester).to receive_messages(url_is_iiif?: true) + + stub_iiif_response_for_url('uri://for-manifest1/manifest', test_manifest1) + end +end + +RSpec.configure do |config| + config.include IiifResponses + config.include StubIiifResponse +end