Skip to content

Instantly share code, notes, and snippets.

module Users
class ChangeAvatar < Command
attribute :avatar_url, Types::Strict::String
end
end
@mariuszkapcia
mariuszkapcia / encrypted_mapper.rb
Last active February 1, 2019 09:57
GDPR support for rails_event_store gem.
MissingEncryptionKey = Class.new(StandardError)
class EncryptedMapper
def event_to_serialized_record(domain_event)
metadata = {}
domain_event.metadata.each do |k, v|
metadata[k] = v
end
encryption_schema = domain_event.class.respond_to?(:encryption_schema) && domain_event.class.encryption_schema
@mariuszkapcia
mariuszkapcia / command_handler.rb
Last active January 28, 2019 18:01
AggregateRoot pattern with extracted events and persistence. Loading and storing of an aggregate is done by DeveloperStore service.
def register(cmd)
ActiveRecord::Base.transaction do
with_developer(cmd.developer_uuid) do |developer|
developer.register
DeveloperRegistered.strict(data: {
developer_uuid: cmd.developer_uuid,
fullname: cmd.fullname,
email: cmd.email
})
@mariuszkapcia
mariuszkapcia / aggreagre_repository.rb
Last active January 28, 2019 17:54
AggregateRoot pattern with extracted load method, store method, version attribute, and unpublished_events array to AggregateRepository.
class AggregateRepository
def load
@event_store.read.stream(@stream_name).forward.each do |event|
@aggregate.apply(event)
@version += 1
end
end
def store(events)
events.each do |event|
@mariuszkapcia
mariuszkapcia / aggregate_repository.rb
Created January 28, 2019 17:49
AggregateRoot pattern with extracted load method, store method, and version attribute to AggregateRepository.
class AggregateRepository
def load(aggregate, stream_name, event_store:)
events = event_store.read.stream(stream_name).forward.each
events.each do |event|
aggregate.apply(event)
end
@version = events.size - 1
aggregate.clear_unpublished_events
end
@mariuszkapcia
mariuszkapcia / aggregate_repository.rb
Created January 28, 2019 17:43
AggregateRoot pattern with extracted load and store methods to AggregateRepository.
class AggregateRepository
def load(aggregate, stream_name, event_store:)
events = event_store.read.stream(stream_name).forward.to_a
events.each do |event|
aggregate.apply(event)
end
aggregate.set_version(events.size - 1)
aggregate.clear_unpublished_events
end
@mariuszkapcia
mariuszkapcia / my_aggregate_root.rb
Last active January 28, 2019 17:45
AggregateRoot pattern with apply_strategy methods.
module MyAggregateRoot
MissingEventInApplyStrategy = Class.new(StandardError)
def load(stream_name, event_store:)
@version = -1
event_store.read.stream(stream_name).forward.each do |event|
apply(event)
@version += 1
end
@mariuszkapcia
mariuszkapcia / my_aggregate_root.rb
Last active January 28, 2019 17:44
Basic AggregateRoot pattern implementation.
module MyAggregateRoot
def load(stream_name, event_store:)
@version = -1
event_store.read.stream(stream_name).forward.each do |event|
apply(event)
@version += 1
end
@stream_name = stream_name
@unpublished_events = []