diff --git a/examples/aggregate_root/lib/project_management.rb b/examples/aggregate_root/lib/project_management.rb index b9b036d..dbc5f36 100644 --- a/examples/aggregate_root/lib/project_management.rb +++ b/examples/aggregate_root/lib/project_management.rb @@ -2,4 +2,5 @@ require_relative "../../../shared/lib/project_management" require_relative "project_management/handler" +require_relative "project_management/repository" require_relative "project_management/issue" diff --git a/examples/aggregate_root/lib/project_management/handler.rb b/examples/aggregate_root/lib/project_management/handler.rb index 6f34608..d369100 100644 --- a/examples/aggregate_root/lib/project_management/handler.rb +++ b/examples/aggregate_root/lib/project_management/handler.rb @@ -1,7 +1,7 @@ module ProjectManagement class Handler def initialize(event_store) - @repository = AggregateRoot::Repository.new(event_store) + @repository = Repository.new(event_store) end def call(cmd) @@ -23,17 +23,50 @@ def call(cmd) raise Error end - def create(cmd) = with_aggregate(cmd.id) { |issue| issue.open } - def resolve(cmd) = with_aggregate(cmd.id) { |issue| issue.resolve } - def close(cmd) = with_aggregate(cmd.id) { |issue| issue.close } - def reopen(cmd) = with_aggregate(cmd.id) { |issue| issue.reopen } - def start(cmd) = with_aggregate(cmd.id) { |issue| issue.start } - def stop(cmd) = with_aggregate(cmd.id) { |issue| issue.stop } - private - def with_aggregate(id, &block) - @repository.with_aggregate(Issue.new(id), "Issue$#{id}", &block) + def create(cmd) + @repository.with_aggregate( + Issue.new(cmd.id), + stream_name(cmd.id) + ) { |issue| issue.open } + end + + def resolve(cmd) + issue = Issue.new(cmd.id) + @repository.load(issue, stream_name(cmd.id)) + issue.resolve + @repository.store(issue, stream_name(cmd.id)) + end + + def close(cmd) + issue = Issue.new(cmd.id) + @repository.load(issue, stream_name(cmd.id)) + issue.close + @repository.store(issue, stream_name(cmd.id)) + end + + def reopen(cmd) + issue = Issue.new(cmd.id) + @repository.load(issue, stream_name(cmd.id)) + issue.reopen + @repository.store(issue, stream_name(cmd.id)) + end + + def start(cmd) + issue = Issue.new(cmd.id) + @repository.load(issue, stream_name(cmd.id)) + issue.start + @repository.store(issue, stream_name(cmd.id)) end + + def stop(cmd) + issue = Issue.new(cmd.id) + @repository.load(issue, stream_name(cmd.id)) + issue.stop + @repository.store(issue, stream_name(cmd.id)) + end + + def stream_name(id) = "Issue$#{id}" end end diff --git a/examples/aggregate_root/lib/project_management/repository.rb b/examples/aggregate_root/lib/project_management/repository.rb new file mode 100644 index 0000000..0ef8840 --- /dev/null +++ b/examples/aggregate_root/lib/project_management/repository.rb @@ -0,0 +1,3 @@ +module ProjectManagement + Repository = AggregateRoot::Repository +end