Skip to content

Instantly share code, notes, and snippets.

@sergueif
Created April 17, 2020 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sergueif/515b481b8409b6b1af025b21a5937a83 to your computer and use it in GitHub Desktop.
Save sergueif/515b481b8409b6b1af025b21a5937a83 to your computer and use it in GitHub Desktop.
module Services
class UserService
#command is an "ActiveModel"
def apply_command(user_id, command)
aggregate = UserAggregate.find_or_create_by_id!(user_id)
aggregate.with_lock do
user = user_value(aggregate)
event = command.apply(user)
new_user = event.apply(user)
aggregate.version += 1
aggregate.events << Event.new(event_type: event.class.to_s, body: event.to_h, version: aggregate.version)
aggregate.body = new_user.to_h
aggregate.save!
end
end
private
def user_value(aggregate)
user = Values::UserValue.new
events = Event.where(aggregate_id: aggregate).order(:version)
events.each do |e|
user = e.event_type.constantize.new(**e.body.symbolize_keys).apply(user)
end
user
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment