Class: RubyEventStore::Event

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_event_store/event.rb

Overview

Data structure representing an event

Direct Known Subclasses

Proto

Constant Summary collapse

BIG_VALUE =
0b111111100100000010010010110011101011000101010101001100100110000

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(event_id: SecureRandom.uuid, metadata: nil, data: {}) ⇒ Event

Instantiates a new event

Parameters:

  • event_id (String) (defaults to: SecureRandom.uuid)

    event id

  • data (Hash) (defaults to: {})

    event data which belong to your application domain

  • metadata (Hash) (defaults to: nil)

    event metadata which are technical and not part of your domain such as remote_ip, request_id, correlation_id, causation_id etc.



15
16
17
18
19
# File 'lib/ruby_event_store/event.rb', line 15

def initialize(event_id: SecureRandom.uuid, metadata: nil, data: {})
  @event_id = event_id.to_s
  @metadata = Metadata.new(.to_h)
  @data     = data
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



21
22
23
# File 'lib/ruby_event_store/event.rb', line 21

def data
  @data
end

#event_idObject (readonly)

Returns the value of attribute event_id.



21
22
23
# File 'lib/ruby_event_store/event.rb', line 21

def event_id
  @event_id
end

#metadataObject (readonly)

Returns the value of attribute metadata.



21
22
23
# File 'lib/ruby_event_store/event.rb', line 21

def 
  @metadata
end

Instance Method Details

#==(other_event) ⇒ TrueClass, FalseClass Also known as: eql?

Two events are equal if:

  • they are of the same class

  • have identical event id

  • have identical data (verified with eql? method)

Event equality ignores metadata!

Parameters:

  • other_event (Event, Object)

    object to compare

Returns:

  • (TrueClass, FalseClass)


65
66
67
68
69
# File 'lib/ruby_event_store/event.rb', line 65

def ==(other_event)
  other_event.instance_of?(self.class) &&
    other_event.event_id.eql?(event_id) &&
    other_event.data.eql?(data)
end

#causation_idString?

Reads causation_id from metadata. / Find out more

Returns:

  • (String, nil)


114
115
116
# File 'lib/ruby_event_store/event.rb', line 114

def causation_id
  [:causation_id]
end

#causation_id=(val) ⇒ String

Sets causation_id= in metadata. / Find out more

Parameters:

  • val (String)

Returns:

  • (String)


123
124
125
# File 'lib/ruby_event_store/event.rb', line 123

def causation_id=(val)
  [:causation_id]= val
end

#correlate_with(other_message) ⇒ String

Sets correlation_id and causation_id in metadata based on correlation_id and message_id of the provided message. / Find out more

Parameters:

  • other_message (Event, Proto, command)

    message to correlate with. Most likely an event or a command. Must respond to correlation_id and message_id.

Returns:

  • (String)

    set causation_id



133
134
135
136
# File 'lib/ruby_event_store/event.rb', line 133

def correlate_with(other_message)
  self.correlation_id = other_message.correlation_id || other_message.message_id
  self.causation_id   = other_message.message_id
end

#correlation_idString?

Reads correlation_id from metadata. / Find out more

Returns:

  • (String, nil)


97
98
99
# File 'lib/ruby_event_store/event.rb', line 97

def correlation_id
  [:correlation_id]
end

#correlation_id=(val) ⇒ String

Sets correlation_id in metadata. / Find out more

Parameters:

  • val (String)

Returns:

  • (String)


106
107
108
# File 'lib/ruby_event_store/event.rb', line 106

def correlation_id=(val)
  [:correlation_id] = val
end

#hashObject

Generates a Fixnum hash value for this object. This function have the property that a.eql?(b) implies a.hash == b.hash.

The hash value is used along with eql? by the Hash class to determine if two objects reference the same hash key.

This hash is based on

  • class

  • event_id

  • data



84
85
86
87
88
89
90
91
# File 'lib/ruby_event_store/event.rb', line 84

def hash
  # We don't use metadata because == does not use metadata
  [
    self.class,
    event_id,
    data
  ].hash ^ BIG_VALUE
end

#message_idString

Event id

Returns:

  • (String)


25
26
27
# File 'lib/ruby_event_store/event.rb', line 25

def message_id
  event_id
end

#timestampTime?

Timestamp from metadata

Returns:

  • (Time, nil)


52
53
54
# File 'lib/ruby_event_store/event.rb', line 52

def timestamp
  [:timestamp]
end

#to_hHash

Returns a hash representation of the event.

Metadata is converted to hash as well

Returns:

  • (Hash)

    with :event_id, :metadata, :data, :type keys



40
41
42
43
44
45
46
47
# File 'lib/ruby_event_store/event.rb', line 40

def to_h
  {
      event_id:   event_id,
      metadata:   .to_h,
      data:       data,
      type:       type,
  }
end

#typeString

Type of event. Used when matching with subscribed handlers.

Returns:

  • (String)


31
32
33
# File 'lib/ruby_event_store/event.rb', line 31

def type
  self.class.name
end