Skip to content

Commit

Permalink
Merge pull request #4176 from samvera/valk-index-visibility
Browse files Browse the repository at this point in the history
Index Visibility when using the valkyrie indexer
  • Loading branch information
jeremyf committed Jan 6, 2020
2 parents e958e18 + 633b72f commit d646a36
Show file tree
Hide file tree
Showing 8 changed files with 145 additions and 3 deletions.
25 changes: 25 additions & 0 deletions app/indexers/hyrax/permission_indexer.rb
@@ -0,0 +1,25 @@
# frozen_string_literal: true

module Hyrax
##
# Indexes `*_groups`/`*_users` style permissions. We depend on these
# permissions being up-to-date in the index to support `Hyrax::Ability`.
#
# @example
# class MyIndexer < Hyrax::ValkyrieIndexer
# include Hyrax::PermissionIndexer
# end
module PermissionIndexer
def to_solr
super.tap do |index_document|
config = Hydra.config.permissions
permissions = Hyrax::PermissionManager.new(resource: resource)

index_document[config.edit.group] = permissions.edit_groups.to_a
index_document[config.edit.individual] = permissions.edit_users.to_a
index_document[config.read.group] = permissions.read_groups.to_a
index_document[config.read.individual] = permissions.read_users.to_a
end
end
end
end
2 changes: 2 additions & 0 deletions app/indexers/hyrax/valkyrie_work_indexer.rb
Expand Up @@ -7,6 +7,8 @@ class ValkyrieWorkIndexer < Hyrax::ValkyrieIndexer
Hyrax::ValkyrieIndexer.register self, as_indexer_for: Hyrax::Work

include Hyrax::ResourceIndexer
include Hyrax::PermissionIndexer
include Hyrax::VisibilityIndexer
include Hyrax::Indexer(:core_metadata)
end
end
26 changes: 26 additions & 0 deletions app/indexers/hyrax/visibility_indexer.rb
@@ -0,0 +1,26 @@
# frozen_string_literal: true

module Hyrax
##
# Indexes visibility of the resource; Blacklight depends on visibility being
# present in the index to determine visibility of results and object show
# views.
#
# @example
# class MyIndexer < Hyrax::ValkyrieIndexer
# include Hyrax::VisibilityIndexer
# end
module VisibilityIndexer
def to_solr
super.tap do |index_document|
index_document[:visibility_ssi] = visibility_reader.read
end
end

private

def visibility_reader
Hyrax::VisibilityReader.new(resource: resource)
end
end
end
48 changes: 48 additions & 0 deletions lib/hyrax/specs/shared_specs/indexers.rb
Expand Up @@ -13,6 +13,54 @@
end
end

RSpec.shared_examples 'a permission indexer' do
subject(:indexer) { indexer_class.new(resource: resource) }
let(:edit_groups) { [:managers] }
let(:edit_users) { [FactoryBot.create(:user)] }
let(:read_users) { [FactoryBot.create(:user)] }

let(:resource) do
FactoryBot.valkyrie_create(:hyrax_work, :public,
read_users: read_users,
edit_groups: edit_groups,
edit_users: edit_users)
end


describe '#to_solr' do
it 'indexes read permissions' do
expect(indexer.to_solr)
.to include(Hydra.config.permissions.read.group => ['public'],
Hydra.config.permissions.read.individual => read_users.map(&:user_key))
end

it 'indexes edit permissions' do
expect(indexer.to_solr)
.to include(Hydra.config.permissions.edit.group => edit_groups.map(&:to_s),
Hydra.config.permissions.edit.individual => edit_users.map(&:user_key))
end
end
end

RSpec.shared_examples 'a visibility indexer' do
subject(:indexer) { indexer_class.new(resource: resource) }
let(:resource) { FactoryBot.build(:hyrax_work) }

describe '#to_solr' do
it 'indexes visibility' do
expect(indexer.to_solr).to include(visibility_ssi: 'restricted')
end

context 'when resource is public' do
let(:resource) { FactoryBot.valkyrie_create(:hyrax_work, :public) }

it 'indexes as open' do
expect(indexer.to_solr).to include(visibility_ssi: 'open')
end
end
end
end

RSpec.shared_examples 'a Basic metadata indexer' do
subject(:indexer) { indexer_class.new(resource: resource) }
let(:resource) { resource_class.new(**attributes) }
Expand Down
19 changes: 16 additions & 3 deletions spec/factories/hyrax_work.rb
Expand Up @@ -13,6 +13,9 @@
end

transient do
edit_users { [] }
edit_groups { [] }
read_users { [] }
members { nil }
visibility_setting { nil }
end
Expand All @@ -24,15 +27,25 @@
.assign_access_for(visibility: evaluator.visibility_setting)
end

work.permission_manager.edit_groups = evaluator.edit_groups
work.permission_manager.edit_users = evaluator.edit_users
work.permission_manager.read_users = evaluator.read_users

work.member_ids = evaluator.members.map(&:id) if evaluator.members
end

after(:create) do |work, evaluator|
if evaluator.visibility_setting
writer = Hyrax::VisibilityWriter.new(resource: work)
writer.assign_access_for(visibility: evaluator.visibility_setting)
writer.permission_manager.acl.save
Hyrax::VisibilityWriter
.new(resource: work)
.assign_access_for(visibility: evaluator.visibility_setting)
end

work.permission_manager.edit_groups = evaluator.edit_groups
work.permission_manager.edit_users = evaluator.edit_users
work.permission_manager.read_users = evaluator.read_users

work.permission_manager.acl.save
end

trait :public do
Expand Down
13 changes: 13 additions & 0 deletions spec/indexers/hyrax/permission_indexer_spec.rb
@@ -0,0 +1,13 @@
# frozen_string_literal: true

require 'hyrax/specs/shared_specs'

RSpec.describe Hyrax::PermissionIndexer do
let(:indexer_class) do
Class.new(Hyrax::ValkyrieIndexer) do
include Hyrax::PermissionIndexer
end
end

it_behaves_like 'a permission indexer'
end
2 changes: 2 additions & 0 deletions spec/indexers/hyrax/valkyrie_work_indexer_spec.rb
Expand Up @@ -9,6 +9,8 @@

it_behaves_like 'a Hyrax::Resource indexer'
it_behaves_like 'a Core metadata indexer'
it_behaves_like 'a permission indexer'
it_behaves_like 'a visibility indexer'

context 'when extending with basic metadata' do
let(:indexer_class) do
Expand Down
13 changes: 13 additions & 0 deletions spec/indexers/hyrax/visibility_indexer_spec.rb
@@ -0,0 +1,13 @@
# frozen_string_literal: true

require 'hyrax/specs/shared_specs'

RSpec.describe Hyrax::VisibilityIndexer do
let(:indexer_class) do
Class.new(Hyrax::ValkyrieIndexer) do
include Hyrax::VisibilityIndexer
end
end

it_behaves_like 'a visibility indexer'
end

0 comments on commit d646a36

Please sign in to comment.