summaryrefslogtreecommitdiff
path: root/app/services/issuable/clone/attributes_rewriter.rb
blob: 3c061d3555829fb2c2a9a44fc578a88db7a0d93a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 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
        return unless new_entity.supports_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