Skip to content

Instantly share code, notes, and snippets.

ContentHasChanged.new(data: {content: new_content})
test 'change advertisement content' do
advertisement_id = SecureRandom.random_number
author_id = SecureRandom.random_number
new_content = "Random content: #{SecureRandom.hex}"
command_bus.(PublishAdvertisement.new(advertisement_id, author_id))
assert_events(
"Advertisement$#{advertisement_id}",
ContentHasChanged.new(data: {content: new_content})
) do
module Advertisements
class Advertisement
include AggregateRoot
AlreadyPublished = Class.new(StandardError)
NotPublished = Class.new(StandardError)
NotAnAuthorOfAdvertisement = Class.new(StandardError)
def initialize(id)
@id = id
module Advertisements
class AdvertisementRepository
def initialize(event_store = Rails.configuration.event_store)
@repository = AggregateRoot::Repository.new(event_store)
end
def with_advertisement(advertisement_id, &block)
stream_name = "Advertisement$#{advertisement_id}"
repository.with_aggregate(Advertisement.new(advertisement_id), stream_name, &block)
end
Rails.configuration.command_bus.tap do |bus|
bus.register(Advertisements::PublishAdvertisement, Advertisements::OnPublishAdvertisement.new)
bus.register(Advertisements::ChangeContent, Advertisements::OnChangeContent.new)
end
module Advertisements
class OnPublishAdvertisement
def call(command)
repository = AdvertisementRepository::new
repository.with_advertisement(command.advertisement_id) do |advertisement|
advertisement.publish(command.author_id)
end
end
end
module Advertisements
class ContentHasChanged < RailsEventStore::Event; end
end
module Advertisements
class ChangeContent
attr_accessor :advertisement_id, :content, :author_id
def initialize(advertisement_id, content, author_id)
@advertisement_id = advertisement_id
@content = content
@author_id = author_id
end
end
end
module Advertisements
class PublishAdvertisement
attr_accessor :advertisement_id
attr_accessor :author_id
def initialize(advertisement_id, author_id)
@advertisement_id = advertisement_id
@author_id = author_id
end
end
end
Rails.autoloaders.each do |autoloader|
autoloader.collapse(Rails.root.join("advertisements/lib/advertisements/events"))
autoloader.collapse(Rails.root.join("advertisements/lib/advertisements/commands"))
end