From c8819005d1447837ac99c7ae2ac49fc316629658 Mon Sep 17 00:00:00 2001 From: Justin Coyne Date: Wed, 31 Oct 2018 12:12:13 -0500 Subject: [PATCH] Add a raw solr endpoint --- .rubocop_todo.yml | 2 +- .../concerns/blacklight/catalog.rb | 7 +++++ lib/blacklight/configuration.rb | 3 +- lib/blacklight/routes/searchable.rb | 1 + .../templates/catalog_controller.rb | 3 ++ spec/controllers/catalog_controller_spec.rb | 28 +++++++++++++++++++ 6 files changed, 42 insertions(+), 2 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index cb61749082..572ea63857 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -226,7 +226,7 @@ Metrics/MethodLength: # Offense count: 8 # Configuration parameters: CountComments. Metrics/ModuleLength: - Max: 210 + Max: 215 # Offense count: 1 # Configuration parameters: CountKeywordArgs. diff --git a/app/controllers/concerns/blacklight/catalog.rb b/app/controllers/concerns/blacklight/catalog.rb index e3a2c821c5..898a361d57 100644 --- a/app/controllers/concerns/blacklight/catalog.rb +++ b/app/controllers/concerns/blacklight/catalog.rb @@ -53,6 +53,13 @@ def show end end + # get a single document from the index + def raw + raise(ActionController::RoutingError, 'Not Found') unless blacklight_config.raw_endpoint.enabled + _, @document = search_service.fetch(params[:id]) + render json: @document + end + # updates the search counter (allows the show view to paginate) def track search_session['counter'] = params[:counter] diff --git a/lib/blacklight/configuration.rb b/lib/blacklight/configuration.rb index eb2e2dbab1..5e18070367 100644 --- a/lib/blacklight/configuration.rb +++ b/lib/blacklight/configuration.rb @@ -124,7 +124,8 @@ def default_values # proc for determining whether the session is a crawler/bot # ex.: crawler_detector: lambda { |req| req.env['HTTP_USER_AGENT'] =~ /bot/ } crawler_detector: nil, - autocomplete_suggester: 'mySuggester' + autocomplete_suggester: 'mySuggester', + raw_endpoint: OpenStructWithHashAccess.new(enabled: false) } end # rubocop:enable Metrics/MethodLength diff --git a/lib/blacklight/routes/searchable.rb b/lib/blacklight/routes/searchable.rb index c8a0959b59..de4535fb2a 100644 --- a/lib/blacklight/routes/searchable.rb +++ b/lib/blacklight/routes/searchable.rb @@ -10,6 +10,7 @@ def call(mapper, _options = {}) mapper.match '/', action: 'index', as: 'search', via: [:get, :post] mapper.post ":id/track", action: 'track', as: 'track' + mapper.get ":id/raw", action: 'raw', as: 'raw', defaults: { format: 'json' } mapper.get "opensearch" mapper.get 'suggest', as: 'suggest_index', defaults: { format: 'json' } diff --git a/lib/generators/blacklight/templates/catalog_controller.rb b/lib/generators/blacklight/templates/catalog_controller.rb index a2ae7447e1..3d14ecb27f 100644 --- a/lib/generators/blacklight/templates/catalog_controller.rb +++ b/lib/generators/blacklight/templates/catalog_controller.rb @@ -12,6 +12,9 @@ class <%= controller_name.classify %>Controller < ApplicationController # ## Model that maps search index responses to the blacklight response model # config.response_model = Blacklight::Solr::Response + # + ## Should the raw solr document endpoint (e.g. /catalog/:id/raw) be enabled + # config.raw_endpoint.enabled = false ## Default parameters to send to solr for all search-like requests. See also SearchBuilder#processed_parameters config.default_solr_params = { diff --git a/spec/controllers/catalog_controller_spec.rb b/spec/controllers/catalog_controller_spec.rb index ba1485503c..26cacef60e 100644 --- a/spec/controllers/catalog_controller_spec.rb +++ b/spec/controllers/catalog_controller_spec.rb @@ -263,6 +263,34 @@ end end + describe '#raw' do + context 'when disabled' do + it "returns 404" do + expect { get :raw, params: { id: doc_id, format: 'json' } }.to raise_error ActionController::RoutingError + end + end + + context 'when enabled' do + before do + allow(controller.blacklight_config.raw_endpoint).to receive(:enabled).and_return(true) + end + + it "gets the raw solr document" do + get :raw, params: { id: doc_id, format: 'json' } + expect(response).to be_successful + json = JSON.parse response.body + expect(json.keys).to match_array( + %w[id _version_ author_addl_tsim author_tsim format isbn_ssim + language_ssim lc_1letter_ssim lc_alpha_ssim lc_b4cutter_ssim + lc_callnum_ssim marc_ss material_type_ssim pub_date_ssim + published_ssim subject_addl_ssim subject_geo_ssim subject_ssim + subject_tsim subtitle_tsim timestamp title_addl_tsim title_tsim + url_suppl_ssim] + ) + end + end + end + # SHOW ACTION describe "show action" do describe "with format :html" do