class Midnight::Mongoid::Interactor
Public Class Methods
new(\ aggregate_key:, build_aggregate:, event_handler: Commons::NULL_EVENT_HANDLER, command_validator: DEFAULT_COMMAND_VALIDATOR, state_persistence: State, advance_state_metadata: lambda(&:advance_metadata), save_state: lambda(&:save!) )
click to toggle source
# File lib/midnight/mongoid/interactor.rb, line 9 def initialize(\ aggregate_key:, build_aggregate:, event_handler: Commons::NULL_EVENT_HANDLER, command_validator: DEFAULT_COMMAND_VALIDATOR, state_persistence: State, advance_state_metadata: lambda(&:advance_metadata), save_state: lambda(&:save!) ) @aggregate_key = aggregate_key @build_aggregate = build_aggregate @event_handler = event_handler @command_validator = command_validator @state_persistence = state_persistence @advance_state_metadata = advance_state_metadata @save_state = save_state freeze end
Public Instance Methods
call(*commands)
click to toggle source
# File lib/midnight/mongoid/interactor.rb, line 28 def call(*commands) commands.each(&@command_validator) transaction do |aggregate| commands.each(&aggregate.method(:dispatch)) aggregate.pending_events end end
Private Instance Methods
transaction(&aggregate_operator)
click to toggle source
# File lib/midnight/mongoid/interactor.rb, line 38 def transaction(&aggregate_operator) state_record = @state_persistence.load( key: @aggregate_key ) aggregate = @build_aggregate.call( state: state_record.state ) state_metadata = state_record.metadata pending_events = aggregate_operator.call(aggregate) return pending_events if pending_events.blank? state_record.state = aggregate.state @advance_state_metadata.call(state_record, pending_events) @save_state.call(state_record) @event_handler.call( pending_events, state_metadata ) pending_events end