synapse-core 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/synapse.rb +1 -1
- data/lib/synapse/command.rb +1 -1
- data/lib/synapse/command/command_handler.rb +1 -1
- data/lib/synapse/command/mapping.rb +71 -0
- data/lib/synapse/command/message.rb +0 -16
- data/lib/synapse/command/simple_command_bus.rb +5 -2
- data/lib/synapse/common/message.rb +16 -0
- data/lib/synapse/configuration.rb +1 -18
- data/lib/synapse/configuration/component/command_bus.rb +7 -24
- data/lib/synapse/configuration/component/command_bus/simple_command_bus.rb +31 -7
- data/lib/synapse/configuration/component/event_bus.rb +3 -8
- data/lib/synapse/configuration/component/event_sourcing.rb +11 -8
- data/lib/synapse/configuration/component/event_sourcing/aggregate_snapshot_taker.rb +48 -0
- data/lib/synapse/configuration/component/event_sourcing/interval_snapshot_policy.rb +33 -0
- data/lib/synapse/configuration/component/event_sourcing/repository.rb +36 -1
- data/lib/synapse/configuration/component/repository.rb +4 -8
- data/lib/synapse/configuration/component/serialization.rb +5 -16
- data/lib/synapse/configuration/component/uow.rb +3 -8
- data/lib/synapse/configuration/component/upcasting.rb +3 -8
- data/lib/synapse/configuration/container_builder.rb +29 -2
- data/lib/synapse/configuration/definition_builder.rb +47 -23
- data/lib/synapse/domain/message.rb +0 -16
- data/lib/synapse/event_bus.rb +1 -1
- data/lib/synapse/event_bus/event_listener.rb +1 -1
- data/lib/synapse/event_bus/mapping.rb +47 -0
- data/lib/synapse/event_sourcing.rb +3 -2
- data/lib/synapse/event_sourcing/aggregate_factory.rb +4 -3
- data/lib/synapse/event_sourcing/aggregate_root.rb +17 -0
- data/lib/synapse/event_sourcing/conflict_resolver.rb +3 -0
- data/lib/synapse/event_sourcing/member.rb +34 -6
- data/lib/synapse/event_sourcing/repository.rb +17 -0
- data/lib/synapse/event_sourcing/snapshot/aggregate_taker.rb +38 -0
- data/lib/synapse/event_sourcing/snapshot/policy.rb +27 -0
- data/lib/synapse/event_sourcing/snapshot/taker.rb +2 -37
- data/lib/synapse/event_sourcing/snapshot/unit_listener.rb +26 -0
- data/lib/synapse/event_sourcing/stream_decorator.rb +8 -6
- data/lib/synapse/event_store/errors.rb +2 -2
- data/lib/synapse/mapping.rb +2 -0
- data/lib/synapse/mapping/mapper.rb +75 -0
- data/lib/synapse/{wiring/wire.rb → mapping/mapping.rb} +8 -8
- data/lib/synapse/process_manager.rb +2 -2
- data/lib/synapse/process_manager/mapping/process.rb +44 -0
- data/lib/synapse/process_manager/{wiring → mapping}/process_manager.rb +13 -13
- data/lib/synapse/process_manager/process.rb +3 -3
- data/lib/synapse/repository/locking.rb +14 -8
- data/lib/synapse/upcasting/upcaster_chain.rb +2 -2
- data/lib/synapse/version.rb +1 -1
- data/test/command/{wiring_test.rb → mapping_test.rb} +11 -11
- data/test/configuration/component/command_bus/simple_command_bus_test.rb +30 -0
- data/test/configuration/component/event_bus/simple_event_bus_test.rb +2 -2
- data/test/configuration/component/event_sourcing/repository_test.rb +71 -0
- data/test/configuration/component/repository/simple_repository_test.rb +35 -0
- data/test/configuration/component/upcasting/upcaster_chain_test.rb +29 -0
- data/test/configuration/container_builder_test.rb +4 -6
- data/test/event_bus/{wiring_test.rb → mapping_test.rb} +6 -6
- data/test/event_sourcing/aggregate_factory_test.rb +5 -1
- data/test/event_sourcing/aggregate_root_test.rb +1 -0
- data/test/event_sourcing/fixtures.rb +21 -21
- data/test/event_sourcing/repository_test.rb +10 -0
- data/test/event_sourcing/snapshot/aggregate_taker_test.rb +1 -1
- data/test/event_sourcing/snapshot/interval_policy_test.rb +24 -0
- data/test/process_manager/{wiring → mapping}/fixtures.rb +7 -8
- data/test/process_manager/{wiring → mapping}/process_manager_test.rb +6 -6
- data/test/process_manager/{wiring → mapping}/process_test.rb +3 -3
- data/test/serialization/converter/chain_test.rb +2 -2
- data/test/serialization/converter/factory_test.rb +2 -2
- data/test/serialization/converter/identity_test.rb +1 -1
- data/test/serialization/converter/json_test.rb +2 -2
- data/test/serialization/converter/ox_test.rb +2 -2
- data/test/serialization/lazy_object_test.rb +1 -1
- data/test/serialization/message/metadata_test.rb +1 -1
- data/test/serialization/message/serialization_aware_message_test.rb +5 -5
- data/test/serialization/message/serialized_message_builder_test.rb +1 -1
- data/test/serialization/message/serialized_message_test.rb +5 -5
- data/test/serialization/message/serializer_test.rb +2 -2
- data/test/serialization/revision_resolver_test.rb +1 -1
- data/test/serialization/serialized_object_test.rb +2 -2
- data/test/serialization/serialized_type_test.rb +2 -2
- data/test/serialization/serializer/marshal_test.rb +1 -1
- data/test/serialization/serializer/oj_test.rb +1 -1
- data/test/serialization/serializer/ox_test.rb +2 -2
- data/test/serialization/serializer_test.rb +1 -1
- data/test/uow/factory_test.rb +1 -1
- data/test/uow/outer_commit_listener_test.rb +4 -4
- data/test/uow/provider_test.rb +5 -5
- data/test/uow/uow_test.rb +19 -17
- data/test/upcasting/chain_test.rb +1 -1
- data/test/upcasting/data_test.rb +3 -1
- metadata +30 -37
- data/lib/synapse/command/wiring.rb +0 -47
- data/lib/synapse/event_bus/wiring.rb +0 -20
- data/lib/synapse/event_sourcing/snapshot/count_stream.rb +0 -86
- data/lib/synapse/event_sourcing/snapshot/count_trigger.rb +0 -91
- data/lib/synapse/process_manager/wiring/process.rb +0 -27
- data/lib/synapse/wiring.rb +0 -3
- data/lib/synapse/wiring/message_wiring.rb +0 -76
- data/lib/synapse/wiring/wire_registry.rb +0 -61
- data/test/event_sourcing/snapshot/integration_test.rb +0 -65
- data/test/wiring/wire_registry_test.rb +0 -60
- data/test/wiring/wire_test.rb +0 -51
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: baa532559d58992e62cae2cc5b843a9485bd10af
|
4
|
+
data.tar.gz: 5d63dd14c2598d92034db8fb45d7e37958a45f98
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5264e9b6b99b0da204d4c0dc9d28f4b1624c1ac28e6ae9e47b5f89d441a4b2a41fe2a4fcde4e25801d7f2aa676b615728881fb4656132f7ed2d5e9f42edcc7e7
|
7
|
+
data.tar.gz: fe5bc48121cacff34fb1ef50a43159902de2d5bf93b34ee5504e440e5a0dd76ea5caa66b5a441d55f154259a271feea30cbe523d8d180f67f7983d1889cdff18
|
data/lib/synapse.rb
CHANGED
data/lib/synapse/command.rb
CHANGED
@@ -29,10 +29,10 @@ require 'synapse/command/command_handler'
|
|
29
29
|
require 'synapse/command/dispatch_interceptor'
|
30
30
|
require 'synapse/command/errors'
|
31
31
|
require 'synapse/command/interceptor_chain'
|
32
|
+
require 'synapse/command/mapping'
|
32
33
|
require 'synapse/command/message'
|
33
34
|
require 'synapse/command/rollback_policy'
|
34
35
|
require 'synapse/command/simple_command_bus'
|
35
|
-
require 'synapse/command/wiring'
|
36
36
|
|
37
37
|
require 'synapse/command/gateway'
|
38
38
|
require 'synapse/command/gateway/retry_scheduler'
|
@@ -2,7 +2,7 @@ module Synapse
|
|
2
2
|
module Command
|
3
3
|
# Mixin for an object capable of handling commands
|
4
4
|
#
|
5
|
-
# Consider using the command handler mixin that uses
|
5
|
+
# Consider using the command handler mixin that uses the mapping DSL.
|
6
6
|
module CommandHandler
|
7
7
|
# Handles the given command
|
8
8
|
#
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Synapse
|
2
|
+
module Command
|
3
|
+
# Mixin for a command handler that uses the mapping DSL
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# class OrderBookCommandHandler
|
7
|
+
# include MappingCommandHandler
|
8
|
+
#
|
9
|
+
# map_command CreateOrderbook do |command|
|
10
|
+
# # ...
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# map_command PlaceBuyOrder, :to => :on_buy_order
|
14
|
+
# map_command PlaceSellOrder, :to => :on_sell_order
|
15
|
+
# end
|
16
|
+
module MappingCommandHandler
|
17
|
+
extend ActiveSupport::Concern
|
18
|
+
include CommandHandler
|
19
|
+
|
20
|
+
included do
|
21
|
+
# @return [Mapping::Mapper]
|
22
|
+
class_attribute :command_mapper
|
23
|
+
self.command_mapper = Mapping::Mapper.new false
|
24
|
+
end
|
25
|
+
|
26
|
+
module ClassMethods
|
27
|
+
# @see Mapper#map
|
28
|
+
# @param [Class] type
|
29
|
+
# @param [Object...] args
|
30
|
+
# @param [Proc] block
|
31
|
+
# @return [undefined]
|
32
|
+
def map_command(type, *args, &block)
|
33
|
+
command_mapper.map type, *args, &block
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [CommandMessage] command
|
38
|
+
# @param [UnitOfWork] current_unit Current unit of work
|
39
|
+
# @return [Object] The result of handling the given command
|
40
|
+
def handle(command, current_unit)
|
41
|
+
mapping = command_mapper.mapping_for command.payload_type
|
42
|
+
|
43
|
+
unless mapping
|
44
|
+
raise ArgumentError, 'Not capable of handling [%s] commands' % command.payload_type
|
45
|
+
end
|
46
|
+
|
47
|
+
mapping.invoke self, command.payload
|
48
|
+
end
|
49
|
+
|
50
|
+
# Subscribes this handler to the given command bus for any types that have been mapped
|
51
|
+
#
|
52
|
+
# @param [CommandBus] command_bus
|
53
|
+
# @return [undefined]
|
54
|
+
def subscribe(command_bus)
|
55
|
+
command_mapper.each_type do |type|
|
56
|
+
command_bus.subscribe type, self
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Unsubscribes this handler from the given command bus for any types that have been mapped
|
61
|
+
#
|
62
|
+
# @param [CommandBus] command_bus
|
63
|
+
# @return [undefined]
|
64
|
+
def unsubscribe(command_bus)
|
65
|
+
command_mapper.each_type do |type|
|
66
|
+
command_bus.unsubscribe type, self
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end # MappingCommandHandler
|
70
|
+
end # Command
|
71
|
+
end
|
@@ -6,22 +6,6 @@ module Synapse
|
|
6
6
|
def self.builder
|
7
7
|
CommandMessageBuilder
|
8
8
|
end
|
9
|
-
|
10
|
-
# Creates a command message using the given command object
|
11
|
-
#
|
12
|
-
# If the given object is an command message, it will be returned unchanged.
|
13
|
-
#
|
14
|
-
# @param [Object] command
|
15
|
-
# @return [CommandMessage]
|
16
|
-
def self.as_message(command)
|
17
|
-
unless command.is_a? CommandMessage
|
18
|
-
command = self.build do |builder|
|
19
|
-
builder.payload = command
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
command
|
24
|
-
end
|
25
9
|
end
|
26
10
|
|
27
11
|
# Message builder capable of producing CommandMessage instances
|
@@ -15,12 +15,15 @@ module Synapse
|
|
15
15
|
# @param [UnitOfWorkFactory] unit_factory
|
16
16
|
# @return [undefined]
|
17
17
|
def initialize(unit_factory)
|
18
|
+
@unit_factory = unit_factory
|
19
|
+
|
18
20
|
@handlers = Hash.new
|
19
21
|
@filters = Array.new
|
20
22
|
@interceptors = Array.new
|
21
|
-
|
23
|
+
|
22
24
|
@rollback_policy = RollbackOnAnyExceptionPolicy.new
|
23
|
-
|
25
|
+
|
26
|
+
@logger = Logging.logger[self.class]
|
24
27
|
end
|
25
28
|
|
26
29
|
# @api public
|
@@ -66,6 +66,22 @@ module Synapse
|
|
66
66
|
builder.build
|
67
67
|
end
|
68
68
|
|
69
|
+
# Wraps an object into a message as its payload
|
70
|
+
#
|
71
|
+
# If the given object is an message, it will be returned unchanged.
|
72
|
+
#
|
73
|
+
# @param [Object] object
|
74
|
+
# @return [Message]
|
75
|
+
def self.as_message(object)
|
76
|
+
unless object.is_a? Message
|
77
|
+
object = self.build do |builder|
|
78
|
+
builder.payload = object
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
object
|
83
|
+
end
|
84
|
+
|
69
85
|
# Yields a message builder that can be used to produce a message
|
70
86
|
#
|
71
87
|
# @see MessageBuilder#build
|
@@ -6,27 +6,10 @@ require 'synapse/configuration/dependent'
|
|
6
6
|
require 'synapse/configuration/ext'
|
7
7
|
|
8
8
|
require 'synapse/configuration/component/command_bus'
|
9
|
-
# Has to be loaded before asynchronous command bus definition builder
|
10
|
-
require 'synapse/configuration/component/command_bus/simple_command_bus'
|
11
|
-
require 'synapse/configuration/component/command_bus/async_command_bus'
|
12
|
-
|
13
9
|
require 'synapse/configuration/component/event_bus'
|
14
|
-
|
15
|
-
|
10
|
+
# Has to be loaded before event sourcing
|
16
11
|
require 'synapse/configuration/component/repository'
|
17
|
-
# Has to be loaded before event sourcing or simple repository definition builders
|
18
|
-
require 'synapse/configuration/component/repository/locking_repository'
|
19
|
-
require 'synapse/configuration/component/repository/simple_repository'
|
20
|
-
|
21
12
|
require 'synapse/configuration/component/event_sourcing'
|
22
|
-
require 'synapse/configuration/component/event_sourcing/repository'
|
23
|
-
|
24
13
|
require 'synapse/configuration/component/serialization'
|
25
|
-
require 'synapse/configuration/component/serialization/converter_factory'
|
26
|
-
require 'synapse/configuration/component/serialization/serializer'
|
27
|
-
|
28
14
|
require 'synapse/configuration/component/uow'
|
29
|
-
require 'synapse/configuration/component/uow/unit_factory'
|
30
|
-
|
31
15
|
require 'synapse/configuration/component/upcasting'
|
32
|
-
require 'synapse/configuration/component/upcasting/upcaster_chain'
|
@@ -1,35 +1,18 @@
|
|
1
|
+
require 'synapse/configuration/component/command_bus/simple_command_bus'
|
2
|
+
require 'synapse/configuration/component/command_bus/async_command_bus'
|
3
|
+
require 'synapse/configuration/component/command_bus/gateway'
|
4
|
+
|
1
5
|
module Synapse
|
2
6
|
module Configuration
|
3
7
|
class ContainerBuilder
|
4
8
|
# Creates and configures an asynchronous command bus
|
5
|
-
|
6
|
-
# @see AsynchronousCommandBusDefinitionBuilder
|
7
|
-
# @param [Symbol] identifier
|
8
|
-
# @param [Proc] block
|
9
|
-
# @return [undefined]
|
10
|
-
def async_command_bus(identifier = nil, &block)
|
11
|
-
with_definition_builder AsynchronousCommandBusDefinitionBuilder, identifier, &block
|
12
|
-
end
|
9
|
+
builder :async_command_bus, AsynchronousCommandBusDefinitionBuilder
|
13
10
|
|
14
11
|
# Creates and configures a simple command bus
|
15
|
-
|
16
|
-
# @see SimpleCommandBusDefinitionBuilder
|
17
|
-
# @param [Symbol] identifier
|
18
|
-
# @param [Proc] block
|
19
|
-
# @return [undefined]
|
20
|
-
def simple_command_bus(identifier = nil, &block)
|
21
|
-
with_definition_builder SimpleCommandBusDefinitionBuilder, identifier, &block
|
22
|
-
end
|
12
|
+
builder :simple_command_bus, SimpleCommandBusDefinitionBuilder
|
23
13
|
|
24
14
|
# Creates and configures a command gateway
|
25
|
-
|
26
|
-
# @see CommandGatewayBusDefinitionBuilder
|
27
|
-
# @param [Symbol] identifier
|
28
|
-
# @param [Proc] block
|
29
|
-
# @return [undefined]
|
30
|
-
def gateway(identifier = nil, &block)
|
31
|
-
with_definition_builder CommandGatewayBusDefinitionBuilder, identifier, &block
|
32
|
-
end
|
15
|
+
builder :gateway, CommandGatewayDefinitionBuilder
|
33
16
|
end # ContainerBuilder
|
34
17
|
end # Configuration
|
35
18
|
end
|
@@ -5,12 +5,12 @@ module Synapse
|
|
5
5
|
# @example The minimum possible effort to build a command bus
|
6
6
|
# simple_command_bus
|
7
7
|
#
|
8
|
-
# @example Create a command bus with an alternate identifier and
|
8
|
+
# @example Create a command bus with an alternate identifier and tags
|
9
9
|
# simple_command_bus :alt_command_bus do
|
10
10
|
# use_handler_tag :alt_command_handler
|
11
|
+
# use_filter_tag :alt_command_filter
|
12
|
+
# use_interceptor_tag :alt_dispatch_interceptor
|
11
13
|
# end
|
12
|
-
#
|
13
|
-
# @todo Support for interceptors and filters
|
14
14
|
class SimpleCommandBusDefinitionBuilder < DefinitionBuilder
|
15
15
|
# Changes the tag to use to automatically subscribe command handlers
|
16
16
|
#
|
@@ -23,6 +23,22 @@ module Synapse
|
|
23
23
|
@handler_tag = handler_tag
|
24
24
|
end
|
25
25
|
|
26
|
+
# Changes the tag to use to automatically register command filters
|
27
|
+
#
|
28
|
+
# @param [Symbol] filter_tag
|
29
|
+
# @return [undefined]
|
30
|
+
def use_filter_tag(filter_tag)
|
31
|
+
@filter_tag = filter_tag
|
32
|
+
end
|
33
|
+
|
34
|
+
# Changes the tag to use to automatically register command filters
|
35
|
+
#
|
36
|
+
# @param [Symbol] interceptor_tag
|
37
|
+
# @return [undefined]
|
38
|
+
def use_interceptor_tag(interceptor_tag)
|
39
|
+
@interceptor_tag = interceptor_tag
|
40
|
+
end
|
41
|
+
|
26
42
|
# Changes the rollback policy to use for the command bus
|
27
43
|
#
|
28
44
|
# By default, the command bus will always rollback on an exception
|
@@ -48,21 +64,29 @@ module Synapse
|
|
48
64
|
identified_by :command_bus
|
49
65
|
|
50
66
|
use_handler_tag :command_handler
|
67
|
+
use_filter_tag :command_filter
|
68
|
+
use_interceptor_tag :dispatch_interceptor
|
69
|
+
|
51
70
|
use_unit_factory :unit_factory
|
52
71
|
|
53
72
|
use_factory do
|
54
73
|
unit_factory = resolve @unit_factory
|
55
74
|
|
56
75
|
command_bus = create_command_bus unit_factory
|
57
|
-
|
58
|
-
if @rollback_policy
|
59
|
-
command_bus.rollback_policy = resolve @rollback_policy
|
60
|
-
end
|
76
|
+
command_bus.rollback_policy = resolve @rollback_policy, true
|
61
77
|
|
62
78
|
with_tagged @handler_tag do |handler|
|
63
79
|
handler.subscribe command_bus
|
64
80
|
end
|
65
81
|
|
82
|
+
with_tagged @filter_tag do |filter|
|
83
|
+
command_bus.filters.push filter
|
84
|
+
end
|
85
|
+
|
86
|
+
with_tagged @interceptor_tag do |interceptor|
|
87
|
+
command_bus.interceptors.push interceptor
|
88
|
+
end
|
89
|
+
|
66
90
|
command_bus
|
67
91
|
end
|
68
92
|
end
|
@@ -1,15 +1,10 @@
|
|
1
|
+
require 'synapse/configuration/component/event_bus/simple_event_bus'
|
2
|
+
|
1
3
|
module Synapse
|
2
4
|
module Configuration
|
3
5
|
class ContainerBuilder
|
4
6
|
# Creates and configures a simple event bus
|
5
|
-
|
6
|
-
# @see SimpleEventBusDefinitionBuilder
|
7
|
-
# @param [Symbol] identifier
|
8
|
-
# @param [Proc] block
|
9
|
-
# @return [undefined]
|
10
|
-
def simple_event_bus(identifier = nil, &block)
|
11
|
-
with_definition_builder SimpleEventBusDefinitionBuilder, identifier, &block
|
12
|
-
end
|
7
|
+
builder :simple_event_bus, SimpleEventBusDefinitionBuilder
|
13
8
|
end # ContainerBuilder
|
14
9
|
end # Configuration
|
15
10
|
end
|
@@ -1,15 +1,18 @@
|
|
1
|
+
require 'synapse/configuration/component/event_sourcing/aggregate_snapshot_taker'
|
2
|
+
require 'synapse/configuration/component/event_sourcing/interval_snapshot_policy'
|
3
|
+
require 'synapse/configuration/component/event_sourcing/repository'
|
4
|
+
|
1
5
|
module Synapse
|
2
6
|
module Configuration
|
3
7
|
class ContainerBuilder
|
4
8
|
# Creates and configures an event sourcing repository
|
5
|
-
|
6
|
-
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
9
|
+
builder :es_repository, EventSourcingRepositoryDefinitionBuilder
|
10
|
+
|
11
|
+
# Creates and configures an aggregate snapshot taker
|
12
|
+
builder :aggregate_snapshot_taker, AggregateSnapshotTakerDefinitionBuilder
|
13
|
+
|
14
|
+
# Creates and configures an interval-based snapshot policy
|
15
|
+
builder :interval_snapshot_policy, IntervalSnapshotPolicyDefinitionBuilder
|
13
16
|
end # ContainerBuilder
|
14
17
|
end # Configuration
|
15
18
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Synapse
|
2
|
+
module Configuration
|
3
|
+
# Definition builder used to create aggregate snapshot takers
|
4
|
+
#
|
5
|
+
# @example The minimum possible effort to build an aggregate snapshot taker
|
6
|
+
# aggregate_snapshot_taker
|
7
|
+
#
|
8
|
+
# @example Build an aggregate snapshot taker using an alternate event store and factory tag
|
9
|
+
# aggregate_snapshot_taker :alt_snapshot_taker do
|
10
|
+
# use_aggregate_factory_tag :alt_factory_tag
|
11
|
+
# use_event_store :alt_event_store
|
12
|
+
# end
|
13
|
+
class AggregateSnapshotTakerDefinitionBuilder < DefinitionBuilder
|
14
|
+
# @param [Symbol] aggregate_factory_tag
|
15
|
+
# @return [undefined]
|
16
|
+
def use_aggregate_factory_tag(aggregate_factory_tag)
|
17
|
+
@aggregate_factory_tag = aggregate_factory_tag
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param [Symbol] event_store
|
21
|
+
# @return [undefined]
|
22
|
+
def use_event_store(event_store)
|
23
|
+
@event_store = event_store
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
# @return [undefined]
|
29
|
+
def populate_defaults
|
30
|
+
identified_by :snapshot_taker
|
31
|
+
|
32
|
+
use_aggregate_factory_tag :aggregate_factory
|
33
|
+
use_event_store :event_store
|
34
|
+
|
35
|
+
use_factory do
|
36
|
+
event_store = resolve @event_store
|
37
|
+
snapshot_taker = EventSourcing::AggregateSnapshotTaker.new event_store
|
38
|
+
|
39
|
+
with_tagged @aggregate_factory_tag do |factory|
|
40
|
+
snapshot_taker.register_factory factory
|
41
|
+
end
|
42
|
+
|
43
|
+
snapshot_taker
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end # AggregateSnapshotTakerDefinitionBuilder
|
47
|
+
end # Configuration
|
48
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Synapse
|
2
|
+
module Configuration
|
3
|
+
# Definition builder used to create an interval-based snapshot policy
|
4
|
+
#
|
5
|
+
# @example The minimum possible effort to build a snapshot policy
|
6
|
+
# interval_snapshot_policy
|
7
|
+
#
|
8
|
+
# @example Build an aggregate snapshot taker using an alternate threshold
|
9
|
+
# interval_snapshot_policy :alt_snapshot_policy do
|
10
|
+
# use_threshold 50
|
11
|
+
# end
|
12
|
+
class IntervalSnapshotPolicyDefinitionBuilder < DefinitionBuilder
|
13
|
+
# @param [Integer] threshold
|
14
|
+
# @return [undefined]
|
15
|
+
def use_threshold(threshold)
|
16
|
+
@threshold = threshold
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
# @return [undefined]
|
22
|
+
def populate_defaults
|
23
|
+
identified_by :snapshot_policy
|
24
|
+
|
25
|
+
use_threshold 30
|
26
|
+
|
27
|
+
use_factory do
|
28
|
+
EventSourcing::AggregateSnapshotTaker.new @threshold
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end # IntervalSnapshotPolicyDefinitionBuilder
|
32
|
+
end # Configuration
|
33
|
+
end
|