From da721789748f8bfded58496487235b5c29a15e5f Mon Sep 17 00:00:00 2001 From: Benjamin Kiah Stroud <32469930+bkiahstroud@users.noreply.github.com> Date: Mon, 20 May 2024 15:41:39 -0700 Subject: [PATCH] fix AdminSet-related 504 timeout errors Work forms were throwing 504 time out errors because large AdminSets being queried by Hyrax#query_service were loading all of their members. This fix is a backport of this Hyrax commit: - https://github.com/samvera/hyrax/commit/75312ee This override is no longer needed when Hyrax's version is >= v5.0.1 --- lib/wings/attribute_transformer_decorator.rb | 47 ++++++++++++++++++++ lib/wings/model_transformer_decorator.rb | 22 +++++++++ 2 files changed, 69 insertions(+) create mode 100644 lib/wings/attribute_transformer_decorator.rb create mode 100644 lib/wings/model_transformer_decorator.rb diff --git a/lib/wings/attribute_transformer_decorator.rb b/lib/wings/attribute_transformer_decorator.rb new file mode 100644 index 000000000..f857cbb3f --- /dev/null +++ b/lib/wings/attribute_transformer_decorator.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module Wings + # OVERRIDE Hyrax v3.6.0 to backport a bug fix from v5.0.1. + # This override is no longer needed when Hyrax's version is >= v5.0.1 + # + # Work forms were throwing 504 time out errors because large AdminSets + # being queried by Hyrax#query_service were loading all of their members. + # + # @see https://github.com/samvera/hyrax/commit/75312ee + module AttributeTransformerDecorator + # OVERRIDE: Replace contents of this method with the version found in v5.0.1 + def run(obj) + attrs = obj.reflections.each_with_object({}) do |(key, reflection), mem| + case reflection + when ActiveFedora::Reflection::HasManyReflection, + ActiveFedora::Reflection::HasAndBelongsToManyReflection, + ActiveFedora::Reflection::IndirectlyContainsReflection + mem[:"#{key.to_s.singularize}_ids"] = + obj.association(key).ids_reader + when ActiveFedora::Reflection::DirectlyContainsReflection + mem[:"#{key.to_s.singularize}_ids"] = + Array(obj.public_send(reflection.name)).map(&:id) + when ActiveFedora::Reflection::FilterReflection, + ActiveFedora::Reflection::OrdersReflection, + ActiveFedora::Reflection::HasSubresourceReflection, + ActiveFedora::Reflection::BelongsToReflection, + ActiveFedora::Reflection::BasicContainsReflection + :noop + when ActiveFedora::Reflection::DirectlyContainsOneReflection + mem[:"#{key.to_s.singularize}_id"] = + obj.public_send(reflection.name)&.id + else + mem[reflection.foreign_key.to_sym] = + obj.public_send(reflection.foreign_key.to_sym) + end + end + + obj.class.delegated_attributes.keys.each_with_object(attrs) do |attr_name, mem| + next unless obj.respond_to?(attr_name) && !mem.key?(attr_name.to_sym) + mem[attr_name.to_sym] = TransformerValueMapper.for(obj.public_send(attr_name)).result + end + end + end +end + +Wings::AttributeTransformer.singleton_class.send(:prepend, Wings::AttributeTransformerDecorator) diff --git a/lib/wings/model_transformer_decorator.rb b/lib/wings/model_transformer_decorator.rb new file mode 100644 index 000000000..f9d57669e --- /dev/null +++ b/lib/wings/model_transformer_decorator.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module Wings + # OVERRIDE Hyrax v3.6.0 to backport a bug fix from v5.0.1. + # This override is no longer needed when Hyrax's version is >= v5.0.1 + # + # Work forms were throwing 504 time out errors because large AdminSets + # being queried by Hyrax#query_service were loading all of their members. + # + # @see https://github.com/samvera/hyrax/commit/75312ee + module ModelTransformerDecorator + # OVERRIDE: Remove :member_ids + def additional_attributes + { :id => pcdm_object.id, + :created_at => pcdm_object.try(:create_date), + :updated_at => pcdm_object.try(:modified_date), + ::Valkyrie::Persistence::Attributes::OPTIMISTIC_LOCK => lock_token } + end + end +end + +Wings::ModelTransformer.prepend(Wings::ModelTransformerDecorator)