From 896411b94b7dfa13239628f05d4bb18dca79680e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Pacana?= Date: Tue, 28 Nov 2023 00:11:00 +0100 Subject: [PATCH] Extract repository --- .../extracted_state/lib/project_management.rb | 1 + .../lib/project_management/handler.rb | 18 ++++++--------- .../lib/project_management/repository.rb | 22 +++++++++++++++++++ 3 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 examples/extracted_state/lib/project_management/repository.rb diff --git a/examples/extracted_state/lib/project_management.rb b/examples/extracted_state/lib/project_management.rb index 8621c5a..c79c6e6 100644 --- a/examples/extracted_state/lib/project_management.rb +++ b/examples/extracted_state/lib/project_management.rb @@ -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" diff --git a/examples/extracted_state/lib/project_management/handler.rb b/examples/extracted_state/lib/project_management/handler.rb index 0e6a6b1..e195db8 100644 --- a/examples/extracted_state/lib/project_management/handler.rb +++ b/examples/extracted_state/lib/project_management/handler.rb @@ -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 @@ -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 diff --git a/examples/extracted_state/lib/project_management/repository.rb b/examples/extracted_state/lib/project_management/repository.rb new file mode 100644 index 0000000..0ae4e3c --- /dev/null +++ b/examples/extracted_state/lib/project_management/repository.rb @@ -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