arkency/rails_event_store

View on GitHub
ruby_event_store/lib/ruby_event_store/record.rb

Summary

Maintainability
A
35 mins
Test Coverage
# frozen_string_literal: true

module RubyEventStore
  class Record
    StringsRequired = Class.new(StandardError)
    def initialize(event_id:, data:, metadata:, event_type:, timestamp:, valid_at:)
      raise StringsRequired unless [event_id, event_type].all? { |v| v.instance_of?(String) }
      @event_id = event_id
      @data = data
      @metadata = metadata
      @event_type = event_type
      @timestamp = timestamp
      @valid_at = valid_at
      @serialized_records = {}
      freeze
    end

    attr_reader :event_id, :data, :metadata, :event_type, :timestamp, :valid_at

    def hash
      [event_id, data, metadata, event_type, timestamp, valid_at].hash ^ self.class.hash
    end

    def ==(other)
      other.instance_of?(self.class) && other.event_id.eql?(event_id) && other.data.eql?(data) &&
        other.metadata.eql?(metadata) && other.event_type.eql?(event_type) && other.timestamp.eql?(timestamp) &&
        other.valid_at.eql?(valid_at)
    end

    def to_h
      {
        event_id: event_id,
        data: data,
        metadata: metadata,
        event_type: event_type,
        timestamp: timestamp,
        valid_at: valid_at
      }
    end

    def serialize(serializer)
      @serialized_records[serializer] ||=
        SerializedRecord.new(
          event_id: event_id,
          event_type: event_type,
          data: serializer.dump(data),
          metadata: serializer.dump(metadata),
          timestamp: timestamp.iso8601(TIMESTAMP_PRECISION),
          valid_at: valid_at.iso8601(TIMESTAMP_PRECISION)
        )
    end

    alias_method :eql?, :==
  end
end