summaryrefslogtreecommitdiff
path: root/app/services/issues/move_service.rb
blob: 41b6a96b005ae9b208ec1a7600f9561369885735 (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
65
66
# frozen_string_literal: true

module Issues
  class MoveService < Issuable::Clone::BaseService
    MoveError = Class.new(StandardError)

    def execute(issue, target_project)
      @target_project = target_project

      unless issue.can_move?(current_user, @target_project)
        raise MoveError, 'Cannot move issue due to insufficient permissions!'
      end

      if @project == @target_project
        raise MoveError, 'Cannot move issue to project it originates from!'
      end

      super

      notify_participants

      new_entity
    end

    private

    def update_old_entity
      super

      mark_as_moved
    end

    def create_new_entity
      new_params = {
                     id: nil,
                     iid: nil,
                     project: @target_project,
                     author: original_entity.author,
                     assignee_ids: original_entity.assignee_ids
                   }

      new_params = original_entity.serializable_hash.symbolize_keys.merge(new_params)
      CreateService.new(@target_project, @current_user, new_params).execute
    end

    def mark_as_moved
      original_entity.update(moved_to: new_entity)
    end

    def notify_participants
      notification_service.async.issue_moved(original_entity, new_entity, @current_user)
    end

    def add_note_from
      SystemNoteService.noteable_moved(new_entity, @target_project,
                                       original_entity, current_user,
                                       direction: :from)
    end

    def add_note_to
      SystemNoteService.noteable_moved(original_entity, old_project,
                                       new_entity, current_user,
                                       direction: :to)
    end
  end
end