From 889e055d94b2e3720467dae97cd5b10b8b296e5d Mon Sep 17 00:00:00 2001 From: Trey Terrell Date: Tue, 12 Jan 2016 15:25:06 -0800 Subject: [PATCH] Add a path to get all collections in one manifest. Closes #339 --- app/controllers/collections_controller.rb | 13 +++++++++ app/presenters/all_collections_presenter.rb | 23 ++++++++++++++++ .../all_collections_manifest_builder.rb | 27 +++++++++++++++++++ .../record_property_builder.rb | 3 +-- config/routes.rb | 25 +++++++++-------- .../controllers/collection_controller_spec.rb | 16 +++++++++++ .../all_collections_presenter_spec.rb | 17 ++++++++++++ spec/routing/collection_manifest_spec.rb | 4 +++ .../all_collections_manifest_builder_spec.rb | 22 +++++++++++++++ 9 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 app/presenters/all_collections_presenter.rb create mode 100644 app/services/all_collections_manifest_builder.rb create mode 100644 spec/presenters/all_collections_presenter_spec.rb create mode 100644 spec/services/all_collections_manifest_builder_spec.rb diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb index ac354727c..e031ad19b 100644 --- a/app/controllers/collections_controller.rb +++ b/app/controllers/collections_controller.rb @@ -1,5 +1,6 @@ class CollectionsController < ApplicationController include CurationConcerns::CollectionsControllerBehavior + skip_load_and_authorize_resource only: :index_manifest def form_class CollectionEditForm @@ -17,12 +18,24 @@ def manifest end end + def index_manifest + respond_to do |f| + f.json do + render json: all_manifests_builder + end + end + end + private def manifest_builder ManifestBuilder.new(presenter, ssl: request.ssl?, services: AuthManifestBuilder.auth_services(login_url, logout_url)) end + def all_manifests_builder + AllCollectionsManifestBuilder.new(nil, ssl: request.ssl?) + end + def login_url main_app.user_omniauth_authorize_url(:cas) end diff --git a/app/presenters/all_collections_presenter.rb b/app/presenters/all_collections_presenter.rb new file mode 100644 index 000000000..9dbff9527 --- /dev/null +++ b/app/presenters/all_collections_presenter.rb @@ -0,0 +1,23 @@ +class AllCollectionsPresenter < CollectionShowPresenter + def initialize(current_ability = nil) + @current_ability = current_ability + end + + def title + "Plum Collections" + end + + def description + "All collections which are a part of Plum." + end + + def creator + nil + end + + private + + def ordered_ids + ActiveFedora::SolrService.query("active_fedora_model_ssi:Collection", rows: 10_000, fl: "id").map { |x| x["id"] } + end +end diff --git a/app/services/all_collections_manifest_builder.rb b/app/services/all_collections_manifest_builder.rb new file mode 100644 index 000000000..56d2c46ac --- /dev/null +++ b/app/services/all_collections_manifest_builder.rb @@ -0,0 +1,27 @@ +class AllCollectionsManifestBuilder < ManifestBuilder + def initialize(record = nil, ssl: false) + super + end + + private + + def root_path + "#{helper.root_url(protocol: protocol)}collections/manifest" + end + + def protocol + if @ssl + :https + else + :http + end + end + + def helper + @helper ||= ManifestBuilder::ManifestHelper.new + end + + def record + @record ||= AllCollectionsPresenter.new + end +end diff --git a/app/services/manifest_builder/record_property_builder.rb b/app/services/manifest_builder/record_property_builder.rb index 3df674a62..4c2764ce7 100644 --- a/app/services/manifest_builder/record_property_builder.rb +++ b/app/services/manifest_builder/record_property_builder.rb @@ -1,10 +1,9 @@ class ManifestBuilder class RecordPropertyBuilder attr_reader :record, :path - def initialize(record, path, ssl: false) + def initialize(record, path) @record = record @path = path - @ssl = ssl end def apply(manifest) diff --git a/config/routes.rb b/config/routes.rb index c62eda58e..7bd109d20 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,17 +8,26 @@ end mount Hydra::RoleManagement::Engine => '/' - mount Hydra::Collections::Engine => '/' - mount CurationConcerns::Engine, at: '/' resources :welcome, only: 'index' root to: 'welcome#index' + # Add URL options + default_url_options Rails.application.config.action_mailer.default_url_options + + # Collections have to go before CC routes, to add index_manifest. + resources :collections, only: [] do + member do + get :manifest, defaults: { format: :json } + end + collection do + get :manifest, defaults: { format: :json }, action: :index_manifest + end + end + mount Hydra::Collections::Engine => '/' + mount CurationConcerns::Engine, at: '/' curation_concerns_collections curation_concerns_basic_routes curation_concerns_embargo_management - # Add URL options - default_url_options Rails.application.config.action_mailer.default_url_options - namespace :curation_concerns, path: :concern do resources :multi_volume_works, only: [] do member do @@ -40,12 +49,6 @@ end end - resources :collections do - member do - get :manifest, defaults: { format: :json } - end - end - namespace :curation_concerns, path: :concern do resources :scanned_resources, only: [:new, :create, :show], path: 'container/:parent_id/scanned_resources', as: 'member_scanned_resource' end diff --git a/spec/controllers/collection_controller_spec.rb b/spec/controllers/collection_controller_spec.rb index 5c324db13..523772f7c 100644 --- a/spec/controllers/collection_controller_spec.rb +++ b/spec/controllers/collection_controller_spec.rb @@ -16,4 +16,20 @@ expect(response).to be_success end end + + describe "#index_manifest" do + let(:user) { FactoryGirl.create(:admin) } + before do + sign_in user + end + it "returns a manifest for all collections" do + FactoryGirl.create(:collection) + allow(AllCollectionsManifestBuilder).to receive(:new).and_call_original + + get :index_manifest, format: :json + + expect(AllCollectionsManifestBuilder).to have_received(:new).with(nil, ssl: false) + expect(response).to be_success + end + end end diff --git a/spec/presenters/all_collections_presenter_spec.rb b/spec/presenters/all_collections_presenter_spec.rb new file mode 100644 index 000000000..1d5af69bb --- /dev/null +++ b/spec/presenters/all_collections_presenter_spec.rb @@ -0,0 +1,17 @@ +require 'rails_helper' + +RSpec.describe AllCollectionsPresenter do + subject { described_class.new } + + it "can be used to build a manifest" do + expect { AllCollectionsManifestBuilder.new(subject).to_json }.not_to raise_error + end + + it "has a title" do + expect(subject.title).to eq "Plum Collections" + end + + it "has a description" do + expect(subject.description).to eq "All collections which are a part of Plum." + end +end diff --git a/spec/routing/collection_manifest_spec.rb b/spec/routing/collection_manifest_spec.rb index 482fccc03..7d2ed5c71 100644 --- a/spec/routing/collection_manifest_spec.rb +++ b/spec/routing/collection_manifest_spec.rb @@ -7,4 +7,8 @@ it "routes to the manifest action" do expect(get manifest_collection_path(id: "1")).to route_to controller: "collections", action: "manifest", format: :json, id: "1" end + + it "can route an index manifest" do + expect(get "/collections/manifest").to route_to controller: "collections", action: "index_manifest", format: :json + end end diff --git a/spec/services/all_collections_manifest_builder_spec.rb b/spec/services/all_collections_manifest_builder_spec.rb new file mode 100644 index 000000000..f41341bc2 --- /dev/null +++ b/spec/services/all_collections_manifest_builder_spec.rb @@ -0,0 +1,22 @@ +require 'rails_helper' + +RSpec.describe AllCollectionsManifestBuilder do + subject { described_class.new } + context "when there are collections" do + let(:manifest_json) { JSON.parse(subject.to_json) } + it "builds them as sub-manifests" do + FactoryGirl.create(:collection) + + expect(manifest_json["manifests"].length).to eq 1 + end + it "has an ID" do + expect(manifest_json["@id"]).to eq "http://plum.com/collections/manifest" + end + context "when SSL is set" do + subject { described_class.new(nil, ssl: true) } + it "can have an SSL ID" do + expect(manifest_json["@id"]).to eq "https://plum.com/collections/manifest" + end + end + end +end