Skip to content

Instantly share code, notes, and snippets.

@SqREL
Created October 20, 2016 23:12
Show Gist options
  • Save SqREL/7863d42329aa1f513ac98d8a9b92ca39 to your computer and use it in GitHub Desktop.
Save SqREL/7863d42329aa1f513ac98d8a9b92ca39 to your computer and use it in GitHub Desktop.
Simple kind of event sourcing
class StateObject
def initialize
@name = nil
@surname = nil
@email = nil
end
def update_name(name)
@name = name
Events::UpdateName.new(name).push
end
def update_surname(surname)
@surname = surname
Events::UpdateSurname.new(surname).push
end
def update_email(email)
@email = email
Events::UpdateEmail.new(email).push
end
def to_s
[
@name,
@surname,
@email
].join(", ")
end
def set_state(attribute, state)
instance_variable_set("@#{attribute}", state)
end
end
module Events
class BaseEvent
def initialize
raise NotImplementedError
end
def push
EventStore.push(self)
state
end
def event_type
raise NotImplementedError
end
def state
raise NotImplementedError
end
end
class UpdateName < BaseEvent
def initialize(surname)
@surname = surname
end
def attribute
"name"
end
def state
@surname
end
end
class UpdateSurname < BaseEvent
def initialize(surname)
@surname = surname
end
def attribute
"surname"
end
def state
@surname
end
end
class UpdateEmail < BaseEvent
def initialize(email)
@email = email
end
def attribute
"email"
end
def state
@email
end
end
end
class EventStore
class << self
def instance
@instance ||= new
end
def push(event)
instance.push(event)
end
def build
instance.build
end
end
def initialize
@vault = []
end
def push(event)
@vault << event
end
def build
buildable_object = StateObject.new
@vault.each do |event|
buildable_object.set_state(event.attribute, event.state)
end
buildable_object
end
end
user = StateObject.new
user.update_email "isqrel@gmail.com"
user.update_name "Vasilij"
user.update_surname "Melnuchyk"
user.update_name "Vasja"
user.update_name "Vasyl"
user.update_surname "Melnychuk"
user.update_email "vasilij@melnychuk.me"
puts "Old user:"
puts user
newuser = EventStore.build
puts "New user"
puts newuser
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment