Sha256: b6d0321a2a7849a845cbf101a4ff1f26459b4bbe83495ca76b3658aa212ef32c

Contents?: true

Size: 1.78 KB

Versions: 1

Compression:

Stored size: 1.78 KB

Contents

module ClosedLoop
  module Machine
    class Transition < Base
      def times_used
        @track_times_used ||= 0
      end

      def available?(target, user)
        role == machine.resolve_role(target, user) &&
          target.status.to_sym == from &&
          none_constraints?(target, user)
      end

      def none_constraints?(target, user)
        machine.configuration.select_constraints_for(self).all? do |constraint|
          constraint.allows?(target, user, transition: self)
        end
      end

      def perform!(target, user)
        target.class.transaction do
          target.status             = to
          target.last_transition_at = Time.current if target.respond_to?(:last_transition_at)

          proc&.call(target, user, transition: self)

          target.save!

          machine.configuration.select_callbacks_for(self).each do |callback|
            callback.perform!(target, user, transition: self)
          end

          raise 'Callback changes were not saved' if target.changed?

          yield(target, user, transition: self) if block_given?
        end

        @track_times_used = times_used + 1
      end

      def perform(target, user, attributes)
        target.class.transaction do
          target.assign_attributes(attributes)
          target.status             = to
          target.last_transition_at = Time.current if target.respond_to?(:last_transition_at)

          if target.save
            proc&.call(target, user, transition: self)

            machine.configuration.select_callbacks_for(self).each do |callback|
              callback.perform!(target, user, transition: self)
            end

            yield(target, user, transition: self) if block_given?
          end
        end

        @track_times_used = times_used + 1
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
closed_loop-0.3.0 lib/closed_loop/machine/transition.rb