class PaperTrail::RelatedChanges::BuildChanges

Attributes

item_id[R]
item_type[R]
model_type_children[R]
results[R]

Public Class Methods

new(results, model_type_children, item_type, item_id) click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 9
def initialize(results, model_type_children, item_type, item_id)
  @results             = results
  @model_type_children = model_type_children
  @item_type           = item_type
  @item_id             = item_id
end

Public Instance Methods

call() click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 16
def call
  changes = results.map do |root_version, versions, request_id|
    versions_serialized         = versions_serialized(versions)
    root_change                 = change_with_root(request_id, root_version, versions_serialized)
    root_change.change.children = children_versions(versions_serialized).map(&:change)
    root_change.change
  end.compact

  remove_duplicate_changes(changes)
end

Private Instance Methods

attribute_version_changes(versions_serialized) click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 59
def attribute_version_changes(versions_serialized)
  versions_serialized.select { |vr| vr.change.merge_into_root }.map(&:change).flat_map(&:diffs)
end
change_with_root(request_id, root_version, versions_serialized) click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 48
def change_with_root(request_id, root_version, versions_serialized)
  s                   = Serializer.new(root_version, item_type: root_version.item_type, root_type: item_type)
  s.change.diffs      = [*s.change.diffs, *attribute_version_changes(versions_serialized)]
  s.change.version_id = request_id || root_version.request_id
  s
end
children_versions(versions_serialized) click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 55
def children_versions(versions_serialized)
  versions_serialized.reject { |vr| vr.change.merge_into_root }
end
model_to_include_name() click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 78
def model_to_include_name
  model_type_children.each_with_object({}) { |(n, r), h| h[r.klass.name] = n }
end
remove_duplicate_changes(changes) click to toggle source

Given a case where a change is represented by a previous change do not show it.

# File lib/paper_trail/related_changes/build_changes.rb, line 30
def remove_duplicate_changes(changes)
  changes.reject.with_index do |change, index|
    stop_iteration = false
    changes[(index + 1)..-1].each do |previous_change|
      change.diffs = change.diffs.reject do |current_change|
        next false if stop_iteration
        previous_matched_change = previous_change
                                    .diffs
                                    .detect { |previous_change| previous_change.attribute == current_change.attribute }
        stop_iteration          = true if previous_matched_change # As soon as their is match stop
        previous_matched_change.eql?(current_change)
      end
    end

    change.empty?
  end
end
versions_serialized(versions) click to toggle source
# File lib/paper_trail/related_changes/build_changes.rb, line 63
def versions_serialized(versions)
  versions.flat_map do |parent_type, versions_with_child_type|
    versions_with_child_type.flat_map do |_type, versions_of_child|
      versions_of_child.map do |version|
        Serializer.new(
          version,
          item_type:             parent_type,
          model_to_include_name: model_to_include_name,
          root_type:             item_type
        )
      end
    end
  end
end