Class: Kabk::Concurrency

Inherits:
Object
  • Object
show all
Defined in:
lib/kabk/concurrency.rb

Overview

Handles Optimistic Concurrency Control (OCC)

Class Method Summary collapse

Class Method Details

.check!(resource, current_record, submitted_params) ⇒ Object

Check if the provided version matches the database state

Parameters:

  • resource (Kabk::Resource)
  • current_record (Sequel::Model)

    The existing record in the DB

  • submitted_params (Hash)

    The payload from the client

Raises:



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/kabk/concurrency.rb', line 13

def self.check!(resource, current_record, )
  return unless resource.concurrency_field

  field = resource.concurrency_field.to_sym
  return unless .key?(field) || .key?(field.to_s)

  client_version = [field] || [field.to_s]
  db_version = current_record.send(field)

  # Handle Time object comparison by converting DB to ISO8601 (which is what the client sends)
  db_version_str = db_version.is_a?(Time) || db_version.respond_to?(:iso8601) ? db_version.iso8601 : db_version.to_s

  if client_version.to_s != db_version_str
    raise ConcurrencyConflictError, "Record has been updated by another user."
  end
end