class Synapse::EventStore::Mongo::DocumentPerCommitStrategy::CommitDocument

Mongo document that represents a commit containing one or more events

Attributes

aggregate_id[R]

@return [Object]

Public Instance Methods

from_events(type_identifier, events, serializer) click to toggle source

@param [String] type_identifier @param [Array] events @param [Serializer] serializer @return [CommitDocument]

# File lib/synapse/event_store/mongo/per_commit_strategy.rb, line 37
def from_events(type_identifier, events, serializer)
  first_event = events.first
  last_event = events.last

  @aggregate_type = type_identifier
  @aggregate_id = first_event.aggregate_id.to_s
  @first_sequence_number = first_event.sequence_number
  @last_sequence_number = last_event.sequence_number
  @first_timestamp = first_event.timestamp
  @last_timestamp = last_event.timestamp

  @events = Array.new
  events.each do |event|
    event_document = EventDocument.new
    event_document.from_event event, serializer

    @events.push event_document
  end

  self
end
from_hash(hash) click to toggle source

@param [Hash] hash @return [CommitDocument]

# File lib/synapse/event_store/mongo/per_commit_strategy.rb, line 61
def from_hash(hash)
  hash.symbolize_keys!

  @aggregate_id = hash.fetch :aggregate_id
  @aggregate_type = hash.fetch :aggregate_type
  @first_sequence_number = hash.fetch :first_sequence_number
  @last_sequence_number = hash.fetch :last_sequence_number
  @first_timestamp = hash.fetch :first_timestamp
  @last_timestamp = hash.fetch :last_timestamp

  @events = Array.new

  event_hashes = hash.fetch :events
  event_hashes.each do |event_hash|
    event_document = EventDocument.new
    event_document.from_hash event_hash

    @events.push event_document
  end

  self
end
to_events(aggregate_id, serializer, upcaster_chain) click to toggle source

@param [Object] aggregate_id The actual aggregate identifier used to query the evnet store @param [Serializer] serializer @param [UpcasterChain] upcaster_chain @return [Array]

# File lib/synapse/event_store/mongo/per_commit_strategy.rb, line 108
def to_events(aggregate_id, serializer, upcaster_chain)
  events = Array.new

  @events.each do |event_document|
    event_data = DocumentDomainEventData.new aggregate_id, event_document
    context = Upcasting::SerializedDomainEventUpcastingContext.new event_data, aggregate_id, serializer

    upcast_objects = upcaster_chain.upcast event_document.payload, context
    upcast_objects.each do |upcast_object|
      upcast_data = Upcasting::UpcastSerializedDomainEventData.new event_data, aggregate_id, upcast_object

      builder = Serialization::SerializedDomainEventMessageBuilder.new

      # Prevent duplicate serialization of metadata if it was accessed during upcasting
      metadata = context.serialized_metadata
      if metadata.deserialized?
        builder.metadata = Serialization::DeserializedObject.new metadata.deserialized
      end

      builder.from_data upcast_data, serializer

      events.push builder.build
    end
  end

  events
end
to_hash() click to toggle source

@return [Hash]

# File lib/synapse/event_store/mongo/per_commit_strategy.rb, line 85
def to_hash
  events = Array.new
  @events.each do |event|
    events.push event.to_hash
  end

  { aggregate_id: @aggregate_id,
    aggregate_type: @aggregate_type,
    # Allows us to use the same query to filter events as DocumentPerEvent
    sequence_number: @first_sequence_number,
    first_sequence_number: @first_sequence_number,
    last_sequence_number: @last_sequence_number,
    # Allows us to use the same query to filter events as DocumentPerEvent
    timestamp: @first_timestamp,
    first_timestamp: @first_timestamp,
    last_timestamp: @last_timestamp,
    events: events }
end