From 511647e3dce3b87427657eba72f3b090967e58cc Mon Sep 17 00:00:00 2001 From: Matt Jonas Date: Mon, 25 Sep 2023 23:09:29 -0700 Subject: [PATCH] Defer until after `perform` instead of `all_perform` all_perform was a redundant callbacks and is entirely enveloped by the Organizer's `perform` callbacks. This change moves the execution of the deferred callbacks to after `perform` rather than `all_perform` to better match the intent of the `defer_after_callbacks_when_organized` attribute. --- lib/active_interactor/interactor/worker.rb | 8 +++++++- lib/active_interactor/organizer/perform.rb | 17 ++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/active_interactor/interactor/worker.rb b/lib/active_interactor/interactor/worker.rb index 644acdd..3e7dc13 100644 --- a/lib/active_interactor/interactor/worker.rb +++ b/lib/active_interactor/interactor/worker.rb @@ -60,10 +60,16 @@ def execute_context! end def execute_context_with_callbacks! - interactor.run_callbacks :perform do + result = interactor.run_callbacks :perform do execute_context_with_validation_check! @context = interactor.finalize_context! end + + if context&.success? && interactor.respond_to?(:run_deferred_after_perform_callbacks_on_children) + interactor.run_deferred_after_perform_callbacks_on_children + end + + result end def execute_context_with_validation! diff --git a/lib/active_interactor/organizer/perform.rb b/lib/active_interactor/organizer/perform.rb index c690107..283b73e 100644 --- a/lib/active_interactor/organizer/perform.rb +++ b/lib/active_interactor/organizer/perform.rb @@ -53,7 +53,14 @@ def perform perform_in_order end end - run_after_perform_callbacks_on_interactors if context.success? + end + + def run_deferred_after_perform_callbacks_on_children + self.class.organized.each do |interface| + next unless interface.interactor_class.after_callbacks_deferred_when_organized + + context.merge!(interface.execute_deferred_after_perform_callbacks(context)) + end end private @@ -100,14 +107,6 @@ def perform_in_parallel end merge_contexts(results.map(&:value)) end - - def run_after_perform_callbacks_on_interactors - self.class.organized.each do |interface| - next unless interface.interactor_class.after_callbacks_deferred_when_organized - - context.merge!(interface.execute_deferred_after_perform_callbacks(context)) - end - end end end end