Module: Upkeep::Runtime::ChangeEvents

Defined in:
lib/upkeep/runtime.rb

Class Method Summary collapse

Class Method Details

.active_record_commit(record) ⇒ Object



372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
# File 'lib/upkeep/runtime.rb', line 372

def active_record_commit(record)
  return active_record_destroy(record) if record.destroyed?

  attribute_changes = previous_changes(record.previous_changes, record.class)

  {
    type: created_record?(record, attribute_changes) ? "create" : "update",
    table: record.class.table_name,
    model: record.class.name,
    id: record.id,
    changed_attributes: attribute_changes.keys.sort,
    old_values: attribute_changes.transform_values { |change| change.fetch(:old) },
    new_values: attribute_changes.transform_values { |change| change.fetch(:new) },
    attribute_changes: attribute_changes
  }
end

.active_record_destroy(record) ⇒ Object



389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
# File 'lib/upkeep/runtime.rb', line 389

def active_record_destroy(record)
  old_values = record.attributes.to_h do |attribute, value|
    [attribute.to_s, serialize_attribute_value(record.class, attribute, value)]
  end

  {
    type: "destroy",
    table: record.class.table_name,
    model: record.class.name,
    id: record.id,
    changed_attributes: old_values.keys.sort,
    old_values: old_values,
    new_values: {},
    attribute_changes: old_values.transform_values { |value| { old: value, new: nil } }
  }
end

.active_record_update_columns(record, changed_attributes:, new_values: {}) ⇒ Object



406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
# File 'lib/upkeep/runtime.rb', line 406

def active_record_update_columns(record, changed_attributes:, new_values: {})
  changed_attributes = Array(changed_attributes).map(&:to_s).sort
  new_values = new_values.to_h do |attribute, value|
    attribute = attribute.to_s
    [attribute, serialize_attribute_value(record.class, attribute, value)]
  end

  {
    type: "update",
    table: record.class.table_name,
    model: record.class.name,
    id: record.class.primary_key && record.public_send(record.class.primary_key),
    changed_attributes: changed_attributes,
    old_values: {},
    new_values: new_values,
    attribute_changes: changed_attributes.to_h do |attribute|
      [attribute, { old: nil, new: new_values[attribute] }]
    end
  }
end

.bulk_delete(table:, model:, changed_attributes:, predicate_sql:, predicate_coverage:, predicate_table_columns:, id: nil) ⇒ Object



449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
# File 'lib/upkeep/runtime.rb', line 449

def bulk_delete(table:, model:, changed_attributes:, predicate_sql:, predicate_coverage:, predicate_table_columns:, id: nil)
  changed_attributes = Array(changed_attributes).map(&:to_s).sort

  event = {
    type: "bulk_delete",
    table: table,
    model: model,
    changed_attributes: changed_attributes,
    old_values: {},
    new_values: {},
    attribute_changes: changed_attributes.to_h { |attribute| [attribute, { old: nil, new: nil }] },
    predicate_sql: predicate_sql,
    predicate_coverage: predicate_coverage,
    predicate_table_columns: predicate_table_columns
  }
  event[:id] = id unless id.nil?
  event
end

.bulk_update(table:, model:, changed_attributes:, predicate_sql:, predicate_coverage:, predicate_table_columns:, new_values: {}, id: nil) ⇒ Object



427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
# File 'lib/upkeep/runtime.rb', line 427

def bulk_update(table:, model:, changed_attributes:, predicate_sql:, predicate_coverage:, predicate_table_columns:, new_values: {}, id: nil)
  changed_attributes = Array(changed_attributes).map(&:to_s).sort
  new_values = new_values.transform_keys(&:to_s)

  event = {
    type: "bulk_update",
    table: table,
    model: model,
    changed_attributes: changed_attributes,
    old_values: {},
    new_values: new_values,
    attribute_changes: changed_attributes.to_h do |attribute|
      [attribute, { old: nil, new: new_values[attribute] }]
    end,
    predicate_sql: predicate_sql,
    predicate_coverage: predicate_coverage,
    predicate_table_columns: predicate_table_columns
  }
  event[:id] = id unless id.nil?
  event
end

.created_record?(record, attribute_changes) ⇒ Boolean

Returns:

  • (Boolean)


484
485
486
487
488
489
490
# File 'lib/upkeep/runtime.rb', line 484

def created_record?(record, attribute_changes)
  primary_key = record.class.primary_key
  return false unless primary_key

  primary_key_change = attribute_changes[primary_key.to_s]
  primary_key_change && primary_key_change.fetch(:old).nil? && !primary_key_change.fetch(:new).nil?
end

.previous_changes(changes, model_class) ⇒ Object



468
469
470
471
472
473
474
475
476
# File 'lib/upkeep/runtime.rb', line 468

def previous_changes(changes, model_class)
  changes.to_h do |attribute, (old_value, new_value)|
    attribute = attribute.to_s
    [attribute, {
      old: serialize_attribute_value(model_class, attribute, old_value),
      new: serialize_attribute_value(model_class, attribute, new_value)
    }]
  end
end

.serialize_attribute_value(model_class, attribute, value) ⇒ Object



478
479
480
481
482
# File 'lib/upkeep/runtime.rb', line 478

def serialize_attribute_value(model_class, attribute, value)
  model_class.type_for_attribute(attribute.to_s).serialize(value)
rescue StandardError
  value
end