Migrating custom components from v1.x to v2.x
Event
metadata[:timestamp]
,metadata[:valid_at]
are now alwaysTime
objects, no parsing needed regardless of chosen serialization of metadata
Repository
-
take serializer as an argument in
initialize
def initialize(serializer)
@serializer = serializer
end -
serialize records before appending to stream with
RubyEventStore::Record#serialize
def append_to_stream(records, stream, expected_version)
serialized_records = records.map { |record| record.serialize(@serializer) }
# ...
end -
deserialize serialized records before returning them from read operations with
RubyEventStore::SerializedRecord#deserialize
def last_stream_event(stream)
# ...
serialized_record = ...serialized_record.deserialize(serializer) if serialized_record
end
def read(spec)
serialized_records =
...if spec.batched?
batch_reader = ->(offset, limit) do
serialized_records
.drop(offset)
.take(limit)
.map { |serialized_record| serialized_record.deserialize(serializer) }
end
BatchEnumerator.new(spec.batch_size, serialized_records.size, batch_reader).each
elsif spec.first?
serialized_records.first&.deserialize(serializer)
elsif spec.last?
serialized_records.last&.deserialize(serializer)
else
Enumerator.new do |y|
serialized_records.each { |serialized_record| y << serialized_record.deserialize(serializer) }
end
end
end
Scheduler
-
take serializer as an argument in
initialize
-
serialize records before scheduling with
RubyEventStore::Record#serialize
module RailsEventStore
class ActiveJobScheduler
def initialize(serializer:)
@serializer = serializer
end
def call(klass, record)
klass.perform_later(record.serialize(@serializer).to_h)
end
end
end
AsyncHandler
-
pass
serializer:
toevent_store.deserialize
Either directly:
class SendOrderEmail < ActiveJob::Base
def perform(payload)
event = event_store.deserialize(**payload.symbolize_keys, serializer: ...)
email = event.data.fetch(:customer_email)
OrderMailer.notify_customer(email).deliver_now!
end
endOr via
RailsEventStore::AsyncHandler.with
module:class SendOrderEmail < ActiveJob::Base
prepend RailsEventStore::AsyncHandler.with(serializer: ...)
def perform(event)
email = event.data.fetch(:customer_email)
OrderMailer.notify_customer(email).deliver_now!
end
end
Mapper
PipelineMapper
-
remove
RubyEventStore::Mappers::Transformation::Serialization.new(serializer: serializer)
transformation step from your pipeline inRubyEventStore::Mappers::PipelineMapper
-
inline
RubyEventStore::Mappers::Pipeline.new(transformations: transformations)
toRubyEventStore::Mappers::Pipeline.new(*transformations)
-
replace
RubyEventStore::Mappers::Transformation::Item
withRubyEventStore::Record
Mapper
-
rename
event_to_serialized_record
toevent_to_record
-
rename
serialized_record_to_event
torecord_to_event
-
replace
RubyEventStore::SerializedRecord
withRubyEventStore::Record
,timestamp
andvalid_at
attributes are ofTime
kind