Module: Yes::Core::Commands::Stateless::HandlerHelpers

Included in:
GroupHandler, Handler
Defined in:
lib/yes/core/commands/stateless/handler_helpers.rb

Overview

Provides helper methods for checking event stream state in stateless command handlers. Includes methods for checking if subjects have been added, removed, published, etc.

Instance Method Summary collapse

Instance Method Details

#activated?(subject, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


110
111
112
113
114
115
116
117
118
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 110

def activated?(subject, event_name, options = {})
  activated_event = last_event(subject, event_name, options)
  return false unless activated_event

  deactivated_event = last_event(subject, event_name.sub('Activated', 'Deactivated'), options)
  return true unless deactivated_event

  activated_event.stream_revision > deactivated_event.stream_revision
end

#added?(subject, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


20
21
22
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 20

def added?(subject, options = {})
  event_in_stream?(subject, 'Added', options)
end

#deactivated?(subject, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


124
125
126
127
128
129
130
131
132
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 124

def deactivated?(subject, event_name, options = {})
  deactivated_event = last_event(subject, event_name, options)
  return false unless deactivated_event

  activated_event = last_event(subject, event_name.sub('Deactivated', 'Activated'), options)
  return true unless activated_event

  deactivated_event.stream_revision > activated_event.stream_revision
end

#disabled?(subject, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


152
153
154
155
156
157
158
159
160
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 152

def disabled?(subject, event_name, options = {})
  disabled_event = last_event(subject, event_name, options)
  return false unless disabled_event

  enabled_event = last_event(subject, event_name.sub('Disabled', 'Enabled'), options)
  return true unless enabled_event

  disabled_event.stream_revision > enabled_event.stream_revision
end

#enabled?(subject, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


138
139
140
141
142
143
144
145
146
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 138

def enabled?(subject, event_name, options = {})
  enabled_event = last_event(subject, event_name, options)
  return false unless enabled_event

  disabled_event = last_event(subject, event_name.sub('Enabled', 'Disabled'), options)
  return true unless disabled_event

  enabled_event.stream_revision > disabled_event.stream_revision
end

#event_exists_with_payload?(subject, payload, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


167
168
169
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 167

def event_exists_with_payload?(subject, payload, event_name, options = {})
  event_in_stream?(subject, event_name, options.merge(payload:))
end

#event_in_stream?(subject, event_name, options = {}) ⇒ Boolean Also known as: changed?

Parameters:

Returns:

  • (Boolean)


175
176
177
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 175

def event_in_stream?(subject, event_name, options = {})
  last_event(subject, event_name, options).present?
end

#item_added?(subject, payload, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


29
30
31
32
33
34
35
36
37
38
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 29

def item_added?(subject, payload, event_name, options = {})
  added_event = last_event(subject, event_name, options.merge(payload: { equal: payload }))
  return false unless added_event

  removed_event = last_event(subject, event_name.sub('Added', 'Removed'),
                             options.merge(payload: { equal: payload }))
  return true unless removed_event

  added_event.stream_revision > removed_event.stream_revision
end

#item_assigned?(subject, payload, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


61
62
63
64
65
66
67
68
69
70
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 61

def item_assigned?(subject, payload, event_name, options = {})
  assigned_event = last_event(subject, event_name, options.merge(payload: { equal: payload }))
  return false unless assigned_event

  removed_event = last_event(subject, event_name.sub('Assigned', 'Unassigned'),
                             options.merge(payload: { equal: payload }))
  return true unless removed_event

  assigned_event.stream_revision > removed_event.stream_revision
end

#item_removed?(subject, payload, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


45
46
47
48
49
50
51
52
53
54
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 45

def item_removed?(subject, payload, event_name, options = {})
  removed_event = last_event(subject, event_name, options.merge(payload: { equal: payload }))
  return false unless removed_event

  added_event = last_event(subject, event_name.sub('Removed', 'Added'),
                           options.merge(payload: { equal: payload }))
  return true unless added_event

  removed_event.stream_revision > added_event.stream_revision
end

#item_unassigned?(subject, payload, event_name, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


77
78
79
80
81
82
83
84
85
86
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 77

def item_unassigned?(subject, payload, event_name, options = {})
  unassigned_event = last_event(subject, event_name, options.merge(payload: { equal: payload }))
  return false unless unassigned_event

  added_event = last_event(subject, event_name.sub('Unassigned', 'Assigned'),
                           options.merge(payload: { equal: payload }))
  return true unless added_event

  unassigned_event.stream_revision > added_event.stream_revision
end

#no_change?(subject, payload, event_name) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 184

def no_change?(subject, payload, event_name)
  options = { resolve_payload: true }
  options[:locale] = payload[:locale] if payload[:locale]
  event = last_event(
    subject,
    event_name,
    options,
    skip_decryption: false
  )

  return false unless event

  payload = payload.as_json
  event.data.all? { |k, v| payload[k] == v }
end

#partial_payload_field_changed?(subject, payload_field_key, event_name, options = {}) ⇒ Boolean

Parameters:

Options Hash (options):

  • :payload (Hash)
  • :locale (String)
  • :resolve_payload (Boolean)

Returns:

  • (Boolean)


208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 208

def partial_payload_field_changed?(subject, payload_field_key, event_name, options = {})
  stream = subject.stream
  enumerable_events = load_events(stream, options: { direction: 'Forwards' })

  partial_data = {}
  event_type = "#{subject.context}::#{subject.subject}#{event_name}"

  enumerable_events.each do |result|
    result.each do |event|
      next unless event.type == event_type
      next if options[:locale] && skip?(options[:locale], event)

      event = resolve_payloads(event) if options[:payload] || options[:resolve_payload]

      event.data[payload_field_key.to_s].each do |key, value|
        partial_data[key] = value
      end
    end
  end

  partial_data.stringify_keys.merge(options[:payload].stringify_keys) != partial_data.stringify_keys
rescue PgEventstore::StreamNotFoundError
  true
end

#published?Boolean

Returns:

  • (Boolean)

See Also:



102
103
104
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 102

def published?(...)
  !unpublished?(...)
end

#removed?(subject, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


13
14
15
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 13

def removed?(subject, options = {})
  event_in_stream?(subject, 'Removed', options)
end

#skip?(locale, event) ⇒ Boolean

Parameters:

  • locale (String)
  • event (PgEventstore::Event)

Returns:

  • (Boolean)


236
237
238
239
240
241
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 236

def skip?(locale, event)
  event_locale = event.data.transform_keys(&:to_s)['locale'].to_s
  return false if event_locale.empty?

  event_locale != locale.to_s
end

#unpublished?(subject, options = {}) ⇒ Boolean

Parameters:

Returns:

  • (Boolean)


91
92
93
94
95
96
97
98
99
# File 'lib/yes/core/commands/stateless/handler_helpers.rb', line 91

def unpublished?(subject, options = {})
  published_event = last_event(subject, 'Published', options)
  return true unless published_event

  unpublished_event = last_event(subject, 'Unpublished', options)
  return false unless unpublished_event

  unpublished_event.stream_revision > published_event.stream_revision
end