module PubSubModelSync::PublisherConcern::ClassMethods

Public Instance Methods

ps_after_action(crud_actions, method_name = nil, &block) click to toggle source

@param crud_actions (Symbol,Array<Symbol>): :create, :update, :destroy @param method_name (Symbol, optional) method to be called

# File lib/pub_sub_model_sync/publisher_concern.rb, line 62
def ps_after_action(crud_actions, method_name = nil, &block)
  actions = Array(crud_actions).map(&:to_sym)
  callback = ->(action) { method_name ? send(method_name, action) : instance_exec(action, &block) }
  ps_cache_publish_callbacks({ actions: actions, callback: callback })
  actions.each do |action|
    if action == :destroy
      after_destroy { instance_exec(action, &callback) }
    else
      ps_define_commit_action(action, callback)
    end
  end
end
ps_cache_publish_callbacks(new_value = nil) click to toggle source
# File lib/pub_sub_model_sync/publisher_concern.rb, line 75
def ps_cache_publish_callbacks(new_value = nil)
  @ps_cache_publish_callbacks ||= []
  @ps_cache_publish_callbacks << new_value if new_value
  @ps_cache_publish_callbacks
end
ps_class_publish(data, action:, as_klass: nil, headers: {}) click to toggle source

Publishes a class level notification via pubsub @param data (Hash): Data of the notification @param action (Symbol): action name of the notification @param as_klass (String, default current class name): Class name of the notification @param headers (Hash, optional): header settings (More in Payload.headers)

# File lib/pub_sub_model_sync/publisher_concern.rb, line 55
def ps_class_publish(data, action:, as_klass: nil, headers: {})
  klass = PubSubModelSync::MessagePublisher
  klass.publish_data((as_klass || name).to_s, data, action.to_sym, headers: headers)
end

Private Instance Methods

ps_define_commit_action(action, callback) click to toggle source
# File lib/pub_sub_model_sync/publisher_concern.rb, line 83
def ps_define_commit_action(action, callback)
  if PubSubModelSync::Config.enable_rails4_before_commit # rails 4 compatibility
    define_method("ps_before_#{action}_commit") { instance_exec(action, &callback) }
  else
    commit_name = respond_to?(:before_commit) ? :before_commit : :after_commit
    send(commit_name, on: action) { instance_exec(action, &callback) }
  end
end
ps_init_transaction_callbacks() click to toggle source

Initialize calls to start and end pub_sub transactions and deliver all them in the same order

# File lib/pub_sub_model_sync/publisher_concern.rb, line 93
def ps_init_transaction_callbacks
  start_transaction = lambda do
    @ps_transaction = PubSubModelSync::MessagePublisher.init_transaction(nil)
  end
  before_create start_transaction, prepend: true
  before_update start_transaction, prepend: true
  before_destroy start_transaction, prepend: true
  after_commit { @ps_transaction&.finish }
  after_rollback(prepend: true) { @ps_transaction&.rollback }
end