Class: Flu::ActiveRecordExtender

Inherits:
Object
  • Object
show all
Defined in:
lib/flu-rails/active_record_extender.rb

Class Method Summary collapse

Class Method Details

.extend_models(event_factory, event_publisher) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/flu-rails/active_record_extender.rb', line 5

def self.extend_models(event_factory, event_publisher)
  ActiveRecord::Base.class_eval do
    define_singleton_method(:track_entity_changes) do |options = {}|
      self.flu_is_tracked               = true
      self.    = options.fetch(:user_metadata, {})
      self.flu_ignored_model_changes    = options.fetch(:ignored_model_changes, []).map(&:to_s)
      self.flu_overriden_emitter_lambda = options.fetch(:emitter, nil)
    
      after_create   { flu_track_entity_change(:create, saved_changes, event_factory) }
      after_update   { flu_track_entity_change(:update, saved_changes, event_factory) }
      after_destroy  { flu_track_entity_change(:destroy, { "id" => [id, nil] }, event_factory) }
      after_commit   { flu_commit_changes(event_factory, event_publisher) }
      after_rollback { flu_rollback_changes }
    end

    def self.flu_ignored_model_changes=(ignored_model_changes)
      @flu_ignored_model_changes = ignored_model_changes
    end

    def self.flu_ignored_model_changes
      @flu_ignored_model_changes
    end

    def self.flu_overriden_emitter_lambda=(overriden_emitter_lambda)
      @flu_overriden_emitter_lambda = overriden_emitter_lambda
    end

    def self.flu_overriden_emitter_lambda
      @flu_overriden_emitter_lambda
    end

    def self.()
      @flu_user_metadata_lambdas = 
    end

    def self.
      @flu_user_metadata_lambdas
    end

    def self.flu_is_tracked=(is_tracked)
      @flu_is_tracked = is_tracked
    end

    def self.flu_is_tracked
      @flu_is_tracked || false
    end

    def self.flu_association_columns
      @flu_association_columns ||= reflect_on_all_associations(:belongs_to).flat_map do |association|
        column_names = [association.foreign_key]
        column_names.push(association.foreign_type) if association.polymorphic?
        column_names
      end
    end

    def flu_changes
      @flu_changes ||= []
    end

    def flu_publish_events!
      run_callbacks(:commit)
    end

    def flu_add_manual_event(name, data)
      raise "data must be a hash" if data.nil? || !data.is_a?(Hash)
      flu_changes.push({
        name: name,
        data: data,
        flu_is_a_manual_event: true
      })
    end

    def flu_changes_as_events(event_factory)
      flu_changes.select do |data|
        !data[:changes].try(:empty?) || data[:flu_is_a_manual_event]
      end.map do |data|
        if data[:flu_is_a_manual_event]
          event_factory.build_manual_event(data[:name], data[:data])
        else
          event_factory.build_entity_change_event(data)
        end
      end
    end

    def flu_commit_changes(event_factory, event_publisher)
      flu_changes_as_events(event_factory).each do |event|
        event_publisher.publish(event)
      end
      flu_flush_changes
    end

    def flu_rollback_changes
      flu_flush_changes
    end

    def flu_flush_changes
      flu_changes.clear
    end

    def flu_track_entity_change(action_name, changes, event_factory)
      unless changes.empty?
        request_id                     = Flu::CoreExt.flu_tracker_request_id
                = Flu::CoreExt.
        data                           = event_factory.create_data_from_entity_changes(action_name,
                                                                                       self,
                                                                                       request_id,
                                                                                       ,
                                                                                       changes,
                                                                                       self.class.[action_name],
                                                                                       self.class.flu_association_columns,
                                                                                       self.class.flu_ignored_model_changes,
                                                                                       self.class.flu_overriden_emitter_lambda)
        flu_changes.push(data) unless data.nil?
      end
    end
  end
end