summaryrefslogtreecommitdiff
path: root/db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb
diff options
context:
space:
mode:
Diffstat (limited to 'db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb')
-rw-r--r--db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb37
1 files changed, 37 insertions, 0 deletions
diff --git a/db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb b/db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb
new file mode 100644
index 00000000000..aee6d5484d5
--- /dev/null
+++ b/db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class PopulateDismissalInformationForVulnerabilities < ActiveRecord::Migration[6.0]
+ DOWNTIME = false
+ BATCH_SIZE = 100
+ UPDATE_QUERY = <<~SQL
+ UPDATE
+ vulnerabilities
+ SET
+ dismissed_at = COALESCE(dismissed_at, updated_at),
+ dismissed_by_id = COALESCE(dismissed_by_id, updated_by_id, last_edited_by_id, author_id)
+ WHERE
+ vulnerabilities.id IN (%{ids})
+ SQL
+
+ class Vulnerability < ActiveRecord::Base
+ include EachBatch
+
+ self.table_name = 'vulnerabilities'
+
+ enum state: { detected: 1, confirmed: 4, resolved: 3, dismissed: 2 }
+
+ scope :broken, -> { dismissed.where('dismissed_at IS NULL OR dismissed_by_id IS NULL') }
+ end
+
+ def up
+ Vulnerability.broken.each_batch(of: BATCH_SIZE) do |batch|
+ query = format(UPDATE_QUERY, ids: batch.select(:id).to_sql)
+
+ connection.execute(query)
+ end
+ end
+
+ def down
+ # no-op
+ end
+end