module ModelTransporter::BatchModelUpdates

Constants

MODEL_UPDATES_EVENT
REQUEST_STORE_NAMESPACE

Public Instance Methods

batch_model_updates() { || ... } click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 23
def batch_model_updates
  RequestStore.store["#{REQUEST_STORE_NAMESPACE}.model_updates"] = Hash.new { |h, k| h[k] = [] }

  yield
ensure
  consolidate_model_updates.each do |channel, message|
    push_update(channel, message)
  end
end
enqueue_model_updates(channel, message) click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 7
def enqueue_model_updates(channel, message)
  if updates_being_batched?
    current_model_updates[channel] << message
  else
    cooked_message = base_model_update_message.merge(payload: message)
    push_update(channel, cooked_message)
  end
end
with_transporter_actor(actor) { || ... } click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 16
def with_transporter_actor(actor)
  RequestStore.store["#{REQUEST_STORE_NAMESPACE}.transporter_actor"] = actor
  yield
ensure
  RequestStore.store.delete("#{REQUEST_STORE_NAMESPACE}.transporter_actor")
end

Private Instance Methods

base_model_update_message() click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 57
def base_model_update_message
  {
    type: MODEL_UPDATES_EVENT,
    actor_id: transporter_actor_id,
    payload: { creates: {}, updates: {}, deletes: {} }
  }
end
consolidate_model_updates() click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 44
def consolidate_model_updates
  current_model_updates.each.with_object({}) do |(channel, messages), consolidated_messages|
    consolidated_messages[channel] = messages.each.with_object(base_model_update_message) do |message, consolidated_message|
      message.each do |update_type, updated_models|
        updated_models.each do |model_name, models|
          consolidated_message[:payload][update_type][model_name] ||= {}
          consolidated_message[:payload][update_type][model_name].merge!(models)
        end
      end
    end
  end
end
current_model_updates() click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 65
def current_model_updates
  RequestStore.store["#{REQUEST_STORE_NAMESPACE}.model_updates"]
end
push_update(channel, message) click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 73
def push_update(channel, message)
  ModelTransporter.configuration.push_adapter.push_update(channel, message)
end
transporter_actor_id() click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 35
def transporter_actor_id
  case actor = RequestStore.store["#{REQUEST_STORE_NAMESPACE}.transporter_actor"]
  when Proc
    actor.call&.id
  else
    actor&.id
  end
end
updates_being_batched?() click to toggle source
# File lib/model_transporter/batch_model_updates.rb, line 69
def updates_being_batched?
  !!current_model_updates
end