diff --git a/app/controllers/qa/linked_data_terms_controller.rb b/app/controllers/qa/linked_data_terms_controller.rb index b8218039..0305bb76 100644 --- a/app/controllers/qa/linked_data_terms_controller.rb +++ b/app/controllers/qa/linked_data_terms_controller.rb @@ -158,8 +158,8 @@ def create_request_header_service end def init_authority - @authority = Qa::Authorities::LinkedData::GenericAuthority.new(vocab_param) - rescue Qa::InvalidLinkedDataAuthority => e + @authority = Qa.authority_for(vocab: params[:vocab], subauthority: params[:subauthority]) + rescue Qa::InvalidAuthorityError, Qa::InvalidLinkedDataAuthority => e msg = e.message logger.warn msg render json: { errors: msg }, status: :bad_request diff --git a/app/controllers/qa/terms_controller.rb b/app/controllers/qa/terms_controller.rb index 05ba7ce9..f9e822a4 100644 --- a/app/controllers/qa/terms_controller.rb +++ b/app/controllers/qa/terms_controller.rb @@ -69,26 +69,14 @@ def check_vocab_param end def init_authority # rubocop:disable Metrics/MethodLength - begin - mod = authority_class.camelize.constantize - rescue NameError - msg = "Unable to initialize authority #{authority_class}" - logger.warn msg - render json: { errors: msg }, status: :bad_request - return - end - begin - @authority = if mod.is_a? Class - mod.new - else - raise Qa::MissingSubAuthority, "No sub-authority provided" if params[:subauthority].blank? - mod.subauthority_for(params[:subauthority]) - end - rescue Qa::InvalidSubAuthority, Qa::MissingSubAuthority => e - msg = e.message - logger.warn msg - render json: { errors: msg }, status: :bad_request - end + @authority = Qa.authority_for(vocab: params[:vocab], + subauthority: params[:subauthority], + # Included to preserve error message text + try_linked_data_config: false) + rescue Qa::InvalidAuthorityError, Qa::InvalidSubAuthority, Qa::MissingSubAuthority => e + msg = e.message + logger.warn msg + render json: { errors: msg }, status: :bad_request end def check_query_param diff --git a/lib/qa.rb b/lib/qa.rb index eaad8823..4118bd23 100644 --- a/lib/qa.rb +++ b/lib/qa.rb @@ -30,6 +30,13 @@ def self.deprecation_warning(in_msg: nil, msg:) warn "[DEPRECATED] #{in_msg}#{msg} It will be removed in the next major release." end + # Raised when the authority is not valid + class InvalidAuthorityError < RuntimeError + def initialize(authority_class) + super "Unable to initialize authority #{authority_class}" + end + end + # Raised when the configuration directory for local authorities doesn't exist class ConfigDirectoryNotFound < StandardError; end @@ -67,4 +74,39 @@ class MissingParameter < StandardError; end # Raised when data is returned but cannot be normalized class DataNormalizationError < StandardError; end + + # @api public + # @since 5.11.0 + # + # @param vocab [String] + # @param subauthority [String] + # + # @param try_linked_data_config [Boolean] when true attempt to check for a linked data authority; + # this is included as an option to help preserve error messaging from the 5.10.0 branch. + # Unless you want to mirror the error messages of `Qa::TermsController#init_authority` then + # use the default value. + # + # @note :try_linked_data_config is included to preserve error message text; something which is + # extensively tested in this gem. + # + # @return [#search, #find] an authority that will respond to #search and #find; and in some cases + # #fetch. This is provided as a means of normalizing how we initialize an authority. + # And to provide a means to request an authority both within a controller request cycle as + # well as outside of that cycle. + def self.authority_for(vocab:, subauthority: nil, try_linked_data_config: true) + authority_constant_name = "Qa::Authorities::#{vocab.to_s.camelcase}" + authority_constant = authority_constant_name.safe_constantize + if authority_constant.nil? + if try_linked_data_config + return Qa::Authorities::LinkedData::GenericAuthority.new(vocab.upcase.to_sym) + else + raise InvalidAuthorityError, authority_constant_name + end + end + + return authority_constant.new if authority_constant.is_a?(Class) + return authority_constant.subauthority_for(subauthority) if subauthority.present? + + raise Qa::MissingSubAuthority, "No sub-authority provided" + end end