Class: Provenance::Journal

Inherits:
Object
  • Object
show all
Defined in:
lib/provenance/journal.rb

Overview

Accumulates model and bulk changes for the current request, grouped by transaction key so they can be discarded on rollback and flushed together once every transaction has completed.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeJournal

Returns a new instance of Journal.



10
11
12
13
# File 'lib/provenance/journal.rb', line 10

def initialize
  @changes = []
  @active_transactions = Set.new
end

Instance Attribute Details

#changesObject (readonly)

Returns the value of attribute changes.



8
9
10
# File 'lib/provenance/journal.rb', line 8

def changes
  @changes
end

Instance Method Details

#add_bulk_change(model_class, action, ids, updates, truncated: false, transaction_id: nil) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/provenance/journal.rb', line 41

def add_bulk_change(model_class, action, ids, updates, truncated: false, transaction_id: nil)
  change_data = {
    model: model_class.name,
    model_ids: ids,
    action: action.to_s,
    count: ids.size,
    changes: updates.nil? ? {} : filter_sensitive_data(updates, model_class),
    timestamp: Time.current.utc.iso8601(3)
  }
  change_data[:truncated] = true if truncated
  change_data[:transaction_id] = transaction_id if transaction_id

  @changes << change_data
end

#add_change(model, action, data) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/provenance/journal.rb', line 27

def add_change(model, action, data)
  change_data = {
    model: model.class.name,
    model_id: model.id,
    action: action.to_s,
    changes: filter_sensitive_data(data, model.class),
    timestamp: Time.current.utc.iso8601(3)
  }

  change_data[:transaction_id] = data[:transaction_id] if data.is_a?(Hash) && data[:transaction_id]

  @changes << change_data
end

#all_transactions_completed?Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/provenance/journal.rb', line 63

def all_transactions_completed?
  @active_transactions.empty?
end

#clear!Object



74
75
76
77
# File 'lib/provenance/journal.rb', line 74

def clear!
  @changes.clear
  @active_transactions.clear
end

#complete_transaction(transaction_id) ⇒ Object



21
22
23
24
25
# File 'lib/provenance/journal.rb', line 21

def complete_transaction(transaction_id)
  return if transaction_id.nil?

  @active_transactions.delete(transaction_id)
end

#empty?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/provenance/journal.rb', line 79

def empty?
  @changes.empty?
end

#present?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/provenance/journal.rb', line 83

def present?
  @changes.any?
end

#register_transaction(transaction_id) ⇒ Object



15
16
17
18
19
# File 'lib/provenance/journal.rb', line 15

def register_transaction(transaction_id)
  return if transaction_id.nil?

  @active_transactions.add(transaction_id)
end

#remove_changes_for_transaction(transaction_id) ⇒ Object



56
57
58
59
60
61
# File 'lib/provenance/journal.rb', line 56

def remove_changes_for_transaction(transaction_id)
  return if transaction_id.nil?

  @changes.reject! { |change| change[:transaction_id] == transaction_id }
  @active_transactions.delete(transaction_id)
end

#to_hObject



67
68
69
70
71
72
# File 'lib/provenance/journal.rb', line 67

def to_h
  {
    count: @changes.size,
    changes: @changes
  }
end