sul-dlss/argo

View on GitHub
app/services/problematic_druid_finder.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

# Given a list of druids and an ability, returns a list of:
#
# * Druids for objects that the ability cannot manage
# * Druids for objects that are not found
class ProblematicDruidFinder
  # @param [#each] druids a list of druids
  # @param [#can?] ability a cancancan ability
  # @return [Hash] a hash containing not found and/or unauthorized druids
  def self.find(druids:, ability:)
    new(druids:, ability:).find
  end

  attr_reader :druids, :ability

  # @param [#each] druids a list of druids
  # @param [#can?] ability a cancancan ability
  def initialize(druids:, ability:)
    @druids = druids
    @ability = ability
  end

  # @return [Array] an array of not found druids (an array) and unauthorized druids (an array)
  def find
    not_found_druids = []
    unauthorized_druids = []

    druids.each do |druid|
      cocina_object = Repository.find(druid)
      unauthorized_druids << druid unless ability.can?(:update, cocina_object)
    rescue Dor::Services::Client::NotFoundResponse
      not_found_druids << druid
    end

    [not_found_druids, unauthorized_druids]
  end
end