From b0c114736e0c9bdd16ce50ca47beca004b811d9c Mon Sep 17 00:00:00 2001 From: Caitlin Date: Tue, 3 Sep 2024 11:02:55 -0400 Subject: [PATCH 1/2] touch evidence on node merge & add affected_ids to issues#index table --- app/services/nodes/merger.rb | 104 ++++++++++++++++--------------- app/views/issues/_table.html.erb | 4 +- 2 files changed, 56 insertions(+), 52 deletions(-) diff --git a/app/services/nodes/merger.rb b/app/services/nodes/merger.rb index ac95dac2b..6a30d7f16 100644 --- a/app/services/nodes/merger.rb +++ b/app/services/nodes/merger.rb @@ -31,66 +31,70 @@ def call private - attr_accessor :target_node, :source_node, :copied_attachments - - DESCENDENT_RELATIONSHIPS = { - activities: :trackable_id, - children: :parent_id, - evidence: :node_id, - notes: :node_id - }.freeze - - def move_descendents - DESCENDENT_RELATIONSHIPS.each do |relation, column| - source_node.send(relation).update_all(column => target_node.id) - end + attr_accessor :target_node, :source_node, :copied_attachments + + DESCENDENT_RELATIONSHIPS = { + activities: :trackable_id, + children: :parent_id, + evidence: :node_id, + notes: :node_id + }.freeze + + def move_descendents + DESCENDENT_RELATIONSHIPS.each do |relation, column| + # update_all doesn't update timestamps so we need to do it manually + source_node.send(relation).update_all( + column => target_node.id, + :updated_at => Time.current + ) end + end - def reset_counter_caches - Node.reset_counters target_node.id, :children_count - end + def reset_counter_caches + Node.reset_counters target_node.id, :children_count + end + + def update_properties + source_node.properties.each do |key, value| + case key.to_sym + when :services + value.each do |service| + data = service.merge(source: :merge) + target_node.set_service data + end + when :services_extras + value.each do |protocol_port, extras| + protocol, port = protocol_port.split('/') + + extras.each do |extra| + data = { + extra[:id] => extra[:output], + source: extra[:source], + port: port.to_i, + protocol: protocol + } - def update_properties - source_node.properties.each do |key, value| - case key.to_sym - when :services - value.each do |service| - data = service.merge(source: :merge) target_node.set_service data end - when :services_extras - value.each do |protocol_port, extras| - protocol, port = protocol_port.split('/') - - extras.each do |extra| - data = { - extra[:id] => extra[:output], - source: extra[:source], - port: port.to_i, - protocol: protocol - } - - target_node.set_service data - end - end - else - target_node.set_property key, value end + else + target_node.set_property key, value end - - target_node.save end - def copy_attachments - self.copied_attachments = [] + target_node.save + end - source_node.attachments.each do |attachment| - copied_attachments << attachment.copy_to(target_node) - end - end + def copy_attachments + self.copied_attachments = [] - def undo_attachments_copy - return unless copied_attachments&.any? - copied_attachments.each(&:delete) + source_node.attachments.each do |attachment| + copied_attachments << attachment.copy_to(target_node) end + end + + def undo_attachments_copy + return unless copied_attachments&.any? + copied_attachments.each(&:delete) + end end diff --git a/app/views/issues/_table.html.erb b/app/views/issues/_table.html.erb index 1ee054deb..d05cb82ad 100644 --- a/app/views/issues/_table.html.erb +++ b/app/views/issues/_table.html.erb @@ -1,4 +1,4 @@ -<% cache ['issues-table', @all_columns, issues.map(&:id), @issues.map(&:updated_at).map(&:to_i).sort.last, @tags] do %> +<% cache ['issues-table', @all_columns, @issues.map(&:affected_ids), issues.map(&:id), @issues.map(&:updated_at).map(&:to_i).sort.last, @tags] do %> <% table_attributes = { behavior: 'dradis-datatable', 'default-columns': @default_columns.to_json, @@ -21,7 +21,7 @@ <% issues.each do |issue| %> - <% cache [issue, @all_columns, issue.try(:affected_count), issue.try(:state), 'issues-table', @tags] do %> + <% cache [issue, @all_columns, issue.try(:affected_count), issue.affected_ids, issue.try(:state), 'issues-table', @tags] do %> <% @all_columns.each do |column| %> From 518e8c84ba22f34980c6a8cbea57b0e564909040 Mon Sep 17 00:00:00 2001 From: Caitlin Date: Tue, 3 Sep 2024 13:16:35 -0400 Subject: [PATCH 2/2] don't touch activities on node merge --- CHANGELOG | 1 + app/services/nodes/merger.rb | 14 +++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0b9e19743..0447cf480 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ [v#.#.#] ([month] [YYYY]) - Kit Import: Use file name sequencing when a template file with the same name exists + - Node merging: Update associated evidence, notes and child nodes updated_at column on node merge - Upgraded gems: - rexml - Bugs fixes: diff --git a/app/services/nodes/merger.rb b/app/services/nodes/merger.rb index 6a30d7f16..0c6c536bc 100644 --- a/app/services/nodes/merger.rb +++ b/app/services/nodes/merger.rb @@ -42,11 +42,15 @@ def call def move_descendents DESCENDENT_RELATIONSHIPS.each do |relation, column| - # update_all doesn't update timestamps so we need to do it manually - source_node.send(relation).update_all( - column => target_node.id, - :updated_at => Time.current - ) + if relation == :activities + source_node.send(relation).update_all(column => target_node.id) + else + # update_all doesn't update timestamps so we need to do it manually + source_node.send(relation).update_all( + column => target_node.id, + :updated_at => Time.current + ) + end end end