Class: Phronomy::Persistence::InMemory::WorkflowStates

Inherits:
Object
  • Object
show all
Defined in:
lib/phronomy/persistence/in_memory.rb

Instance Method Summary collapse

Constructor Details

#initialize(owner) ⇒ WorkflowStates

Returns a new instance of WorkflowStates.



213
# File 'lib/phronomy/persistence/in_memory.rb', line 213

def initialize(owner) = @owner = owner

Instance Method Details

#delete(thread_id, expected_revision:) ⇒ Object



247
248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/phronomy/persistence/in_memory.rb', line 247

def delete(thread_id, expected_revision:)
  @owner.synchronize do
    key = thread_id.to_s
    current = @owner.workflow_state_data[key]
    actual_revision = current&.fetch(:revision)
    unless actual_revision == expected_revision
      raise ConflictError,
        "workflow state revision conflict for #{key}: " \
        "expected #{expected_revision.inspect}, actual #{actual_revision.inspect}"
    end
    @owner.workflow_state_data.delete(key)
  end
  nil
end

#load(thread_id) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
# File 'lib/phronomy/persistence/in_memory.rb', line 215

def load(thread_id)
  @owner.synchronize do
    record = @owner.workflow_state_data[thread_id.to_s]
    next nil unless record

    {
      snapshot: @owner.deep_dup_workflow_value(record.fetch(:snapshot)),
      revision: record.fetch(:revision)
    }.freeze
  end
end

#save(thread_id, expected_revision:, snapshot:) ⇒ Object



227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/phronomy/persistence/in_memory.rb', line 227

def save(thread_id, expected_revision:, snapshot:)
  @owner.synchronize do
    key = thread_id.to_s
    current = @owner.workflow_state_data[key]
    actual_revision = current&.fetch(:revision)
    unless actual_revision == expected_revision
      raise ConflictError,
        "workflow state revision conflict for #{key}: " \
        "expected #{expected_revision.inspect}, actual #{actual_revision.inspect}"
    end

    next_revision = actual_revision ? actual_revision + 1 : 1
    @owner.workflow_state_data[key] = {
      snapshot: @owner.deep_dup_workflow_value(snapshot),
      revision: next_revision
    }
    next_revision
  end
end