63 lines
1.8 KiB
Ruby
63 lines
1.8 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Issuable
|
||
|
module Clone
|
||
|
class AttributesRewriter < ::Issuable::Clone::BaseService
|
||
|
def initialize(current_user, original_entity, new_entity)
|
||
|
@current_user = current_user
|
||
|
@original_entity = original_entity
|
||
|
@new_entity = new_entity
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
new_entity.update(milestone: cloneable_milestone, labels: cloneable_labels)
|
||
|
copy_resource_label_events
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def cloneable_milestone
|
||
|
title = original_entity.milestone&.title
|
||
|
return unless title
|
||
|
|
||
|
params = { title: title, project_ids: new_entity.project&.id, group_ids: group&.id }
|
||
|
|
||
|
milestones = MilestonesFinder.new(params).execute
|
||
|
milestones.first
|
||
|
end
|
||
|
|
||
|
def cloneable_labels
|
||
|
params = {
|
||
|
project_id: new_entity.project&.id,
|
||
|
group_id: group&.id,
|
||
|
title: original_entity.labels.select(:title),
|
||
|
include_ancestor_groups: true
|
||
|
}
|
||
|
|
||
|
params[:only_group_labels] = true if new_parent.is_a?(Group)
|
||
|
|
||
|
LabelsFinder.new(current_user, params).execute
|
||
|
end
|
||
|
|
||
|
def copy_resource_label_events
|
||
|
original_entity.resource_label_events.find_in_batches do |batch|
|
||
|
events = batch.map do |event|
|
||
|
entity_key = new_entity.is_a?(Issue) ? 'issue_id' : 'epic_id'
|
||
|
# rubocop: disable CodeReuse/ActiveRecord
|
||
|
event.attributes
|
||
|
.except('id', 'reference', 'reference_html')
|
||
|
.merge(entity_key => new_entity.id, 'action' => ResourceLabelEvent.actions[event.action])
|
||
|
# rubocop: enable CodeReuse/ActiveRecord
|
||
|
end
|
||
|
|
||
|
Gitlab::Database.bulk_insert(ResourceLabelEvent.table_name, events)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def entity_key
|
||
|
new_entity.class.name.parameterize('_').foreign_key
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|