49 lines
1.4 KiB
Ruby
49 lines
1.4 KiB
Ruby
![]() |
# frozen_string_literal: true
|
||
|
|
||
|
class CreateMissingVulnerabilitiesIssueLinks < ActiveRecord::Migration[6.0]
|
||
|
class VulnerabilitiesFeedback < ActiveRecord::Base
|
||
|
include EachBatch
|
||
|
self.table_name = 'vulnerability_feedback'
|
||
|
end
|
||
|
|
||
|
class VulnerabilitiesIssueLink < ActiveRecord::Base
|
||
|
self.table_name = 'vulnerability_issue_links'
|
||
|
LINK_TYPE_CREATED = 2
|
||
|
end
|
||
|
|
||
|
include Gitlab::Database::MigrationHelpers
|
||
|
|
||
|
DOWNTIME = false
|
||
|
|
||
|
disable_ddl_transaction!
|
||
|
|
||
|
def up
|
||
|
VulnerabilitiesFeedback.where('issue_id IS NOT NULL').each_batch do |relation|
|
||
|
timestamp = Time.now
|
||
|
issue_links = relation
|
||
|
.joins("JOIN vulnerability_occurrences vo ON vo.project_id = vulnerability_feedback.project_id AND vo.report_type = vulnerability_feedback.category AND encode(vo.project_fingerprint, 'hex') = vulnerability_feedback.project_fingerprint")
|
||
|
.where('vo.vulnerability_id IS NOT NULL')
|
||
|
.pluck(:vulnerability_id, :issue_id)
|
||
|
.map do |v_id, i_id|
|
||
|
{
|
||
|
vulnerability_id: v_id,
|
||
|
issue_id: i_id,
|
||
|
link_type: VulnerabilitiesIssueLink::LINK_TYPE_CREATED,
|
||
|
created_at: timestamp,
|
||
|
updated_at: timestamp
|
||
|
}
|
||
|
end
|
||
|
|
||
|
next if issue_links.empty?
|
||
|
|
||
|
VulnerabilitiesIssueLink.insert_all(
|
||
|
issue_links,
|
||
|
returning: false
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
end
|
||
|
end
|