From d15e9c145c8cc8ad821b8d68a31dd9131021327a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Pacana?= Date: Tue, 28 Nov 2023 00:31:24 +0100 Subject: [PATCH] Extract repository --- .../query_based/lib/project_management.rb | 1 + .../lib/project_management/handler.rb | 11 ++++----- .../project_management/issue_projection.rb | 10 ++------ .../lib/project_management/repository.rb | 23 +++++++++++++++++++ 4 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 examples/query_based/lib/project_management/repository.rb diff --git a/examples/query_based/lib/project_management.rb b/examples/query_based/lib/project_management.rb index 0810dba..8b41327 100644 --- a/examples/query_based/lib/project_management.rb +++ b/examples/query_based/lib/project_management.rb @@ -1,4 +1,5 @@ require_relative "../../../shared/lib/project_management" require_relative "project_management/issue" +require_relative "project_management/repository" require_relative "project_management/issue_projection" require_relative "project_management/handler" diff --git a/examples/query_based/lib/project_management/handler.rb b/examples/query_based/lib/project_management/handler.rb index 354a142..0c97735 100644 --- a/examples/query_based/lib/project_management/handler.rb +++ b/examples/query_based/lib/project_management/handler.rb @@ -1,7 +1,7 @@ module ProjectManagement class Handler def initialize(event_store) - @event_store = event_store + @repository = Repository.new(event_store) end def call(cmd) @@ -65,13 +65,10 @@ def stop(id) private - def stream_name(id) = "Issue$#{id}" - def with_aggregate(id) - issue = - IssueProjection.new(@event_store).call(Issue.initial, stream_name(id)) - - @event_store.append(yield(issue), stream_name: stream_name(id)) + issue = @repository.load(id, Issue.initial) + events = yield(issue) + @repository.store(id, events) end end end diff --git a/examples/query_based/lib/project_management/issue_projection.rb b/examples/query_based/lib/project_management/issue_projection.rb index e1b9030..2688d27 100644 --- a/examples/query_based/lib/project_management/issue_projection.rb +++ b/examples/query_based/lib/project_management/issue_projection.rb @@ -1,13 +1,7 @@ module ProjectManagement class IssueProjection - def initialize(event_store) - @event_store = event_store - end - - def call(initial_issue, stream_name) - @event_store - .read - .stream(stream_name) + def self.call(query, initial_issue) + query .reduce(initial_issue) do |issue, event| case event when IssueOpened diff --git a/examples/query_based/lib/project_management/repository.rb b/examples/query_based/lib/project_management/repository.rb new file mode 100644 index 0000000..33b016a --- /dev/null +++ b/examples/query_based/lib/project_management/repository.rb @@ -0,0 +1,23 @@ +module ProjectManagement + class Repository + def initialize(event_store) + @event_store = event_store + end + + def load(id, initial_state) + query = + @event_store + .read + .stream(stream_name(id)) + IssueProjection.call(query, initial_state) + end + + def store(id, events) + @event_store.append(events, stream_name: stream_name(id)) + end + + private + + def stream_name(id) = "Issue$#{id}" + end +end \ No newline at end of file