Sha256: ca163881ae6ad6a9291295f1b6a0282c5b0ef6030ecb2f90e14e355f0e2aacca

Contents?: true

Size: 1.57 KB

Versions: 15

Compression:

Stored size: 1.57 KB

Contents

module Reactor::Publishable
  extend ActiveSupport::Concern

  included do
    after_commit :schedule_events, if: :persisted?, on: :create
    after_commit :reschedule_events_on_update, if: :persisted?, on: :update
  end

  def publish(name, data = {})
    Reactor::Event.publish(name, data.merge(actor: self) )
  end

  def reschedule_events
    self.class.events.each do |name, data|
      reschedule(name, data)
    end
  end

  module ClassMethods
    def publishes(name, data = {})
      events[name] = data
    end

    def events
      @events ||= {}
    end
  end

  private

  def reschedule_events_on_update
    self.class.events.each do |name, data|
      attr_changed_method = data[:watch] || data[:at]
      if previous_changes[attr_changed_method]
        reschedule(name, data)
      end
    end
  end

  def reschedule(name, data)
    if data[:at]
      Reactor::Event.reschedule name,
        data.merge(
            at: send(data[:at]),
            actor: ( data[:actor] ? send(data[:actor]) : self ),
            target: ( data[:target] ? self : nil),
            was: previous_changes[data[:at]].try(:first) || send("#{data[:at]}_was"))
    end
  end

  def schedule_events
    self.class.events.each do |name, data|
      event = event_data_for_signature(data)
      Reactor::Event.publish name, event
    end
  end

  def event_data_for_signature(signature)
    signature.merge(
        actor: (signature[:actor] ? send(signature[:actor]) : self),
        target: (signature[:target] ? self : nil),
        at: (signature[:at] ? send(signature[:at]) : nil)
    ).except(:watch)
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
reactor-0.16.1 lib/reactor/models/concerns/publishable.rb
reactor-0.16.0 lib/reactor/models/concerns/publishable.rb
reactor-0.15.1 lib/reactor/models/concerns/publishable.rb
reactor-0.15.0 lib/reactor/models/concerns/publishable.rb
reactor-0.14.0 lib/reactor/models/concerns/publishable.rb
reactor-0.13.0 lib/reactor/models/concerns/publishable.rb
reactor-0.12.2 lib/reactor/models/concerns/publishable.rb
reactor-0.12.1 lib/reactor/models/concerns/publishable.rb
reactor-0.11.4 lib/reactor/models/concerns/publishable.rb
reactor-0.11.2 lib/reactor/models/concerns/publishable.rb
reactor-0.11.1 lib/reactor/models/concerns/publishable.rb
reactor-0.11.0 lib/reactor/models/concerns/publishable.rb
reactor-0.10.1 lib/reactor/models/concerns/publishable.rb
reactor-0.10.0 lib/reactor/models/concerns/publishable.rb
reactor-0.9.9 lib/reactor/models/concerns/publishable.rb