Skip to content

Commit

Permalink
Extract repository
Browse files Browse the repository at this point in the history
  • Loading branch information
mostlyobvious committed Nov 27, 2023
1 parent 8983aed commit 896411b
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 11 deletions.
1 change: 1 addition & 0 deletions examples/extracted_state/lib/project_management.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require_relative "../../../shared/lib/project_management"
require_relative "project_management/handler"
require_relative "project_management/issue"
require_relative "project_management/repository"
require_relative "project_management/issue_state"
18 changes: 7 additions & 11 deletions examples/extracted_state/lib/project_management/handler.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
module ProjectManagement
class Handler
def initialize(event_store) = @event_store = event_store
def initialize(event_store)
@repository = Repository.new(event_store)
end

def call(cmd)
case cmd
Expand Down Expand Up @@ -30,18 +32,12 @@ def stop(id) = with_aggregate(id) { |issue| issue.stop }

private

def stream_name(id) = "Issue$#{id}"

def with_aggregate(id)
state =
@event_store
.read
.stream(stream_name(id))
.reduce(IssueState.initial(id)) { |state, event| state.apply(event) }

yield issue = Issue.new(state)
state = @repository.load(id, IssueState.initial(id))
issue = Issue.new(state)
yield issue

@event_store.append(issue.changes, stream_name: stream_name(id))
@repository.store(id, issue.changes)
end
end
end
22 changes: 22 additions & 0 deletions examples/extracted_state/lib/project_management/repository.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module ProjectManagement
class Repository
def initialize(event_store)
@event_store = event_store
end

def load(id, initial_state)
@event_store
.read
.stream(stream_name(id))
.reduce(initial_state) { |state, event| state.apply(event) }
end

def store(id, events)
@event_store.append(events, stream_name: stream_name(id))
end

private

def stream_name(id) = "Issue$#{id}"
end
end

0 comments on commit 896411b

Please sign in to comment.