Sha256: 942c4425aaa06b534e5a06facf2a79c112e7bf075ccc3f8221f3c163790f6549

Contents?: true

Size: 1.94 KB

Versions: 2

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

module ConvenientService
  module Service
    module Plugins
      module CanHaveRollbacks
        class Middleware < MethodChainMiddleware
          intended_for :result, entity: :service

          ##
          # @return [ConvenientService::Service::Plugins::HasJSendResult::Entities::Result]
          #
          def next(...)
            result = chain.next(...)

            rollback_result(result) if result.status.unsafe_not_success?

            result
          end

          private

          ##
          # @param result [ConvenientService::Service::Plugins::HasJSendResult::Entities::Result]
          # @return [void]
          #
          # @internal
          #   IMPORTANT: Uses recursion inside `rollback_organizer`. Recursion has two exit conditions. When service has no steps. When service has only method steps.
          #
          def rollback_result(result)
            result.from_step? ? rollback_organizer(result.service) : rollback_service(result.service)
          end

          ##
          # Calls service own rollback.
          #
          # @param service [ConvenientService::Service]
          # @return [void]
          #
          # @internal
          #   TODO: Compare what is faster `respond_to?` or `own_method`.
          #
          def rollback_service(service)
            Utils::Object.safe_send(service, :rollback_result)
          end

          ##
          # Calls organizer own rollback.
          # Then calls organizer steps rollbacks with nestings in the reverse order.
          #
          # @param organizer [ConvenientService::Service]
          # @return [void]
          #
          def rollback_organizer(organizer)
            rollback_service(organizer)

            organizer.steps
              .select(&:completed?)
              .reject(&:method_step?)
              .reverse_each { |step| rollback_result(step.service_result) }
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
convenient_service-0.19.1 lib/convenient_service/service/plugins/can_have_rollbacks/middleware.rb
convenient_service-0.19.0 lib/convenient_service/service/plugins/can_have_rollbacks/middleware.rb