diff options
author | Jarka Košanová <jarka@gitlab.com> | 2018-10-29 12:05:47 +0300 |
---|---|---|
committer | Jarka Košanová <jarka@gitlab.com> | 2018-11-12 10:57:25 +0300 |
commit | 4af1712d01efb7295cc069dca0045b01c7b4cb40 (patch) | |
tree | d32a325b8d7e0a7ee00e032e8927e4ba9af9c29d /app/services/issuable/clone/base_service.rb | |
parent | 2e690c8208e9da5e7152e77cd77efdade5260be1 (diff) |
Extract code from Issues::MoveService
Extract code to make it easier reusable
- introduce AttributesRewriter and ContentRewriter
- support group entites when rewriting content
- make Uploader copy_to working for Namespaces
Diffstat (limited to 'app/services/issuable/clone/base_service.rb')
-rw-r--r-- | app/services/issuable/clone/base_service.rb | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/app/services/issuable/clone/base_service.rb b/app/services/issuable/clone/base_service.rb new file mode 100644 index 00000000000..42dd9c666f5 --- /dev/null +++ b/app/services/issuable/clone/base_service.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +module Issuable + module Clone + class BaseService < IssuableBaseService + attr_reader :original_entity, :new_entity + + alias_method :old_project, :project + + def execute(original_entity, new_project = nil) + @original_entity = original_entity + + # Using transaction because of a high resources footprint + # on rewriting notes (unfolding references) + # + ActiveRecord::Base.transaction do + @new_entity = create_new_entity + + update_new_entity + update_old_entity + create_notes + end + end + + private + + def update_new_entity + rewriters = [ContentRewriter, AttributesRewriter] + + rewriters.each do |rewriter| + rewriter.new(current_user, original_entity, new_entity).execute + end + end + + def update_old_entity + close_issue + end + + def create_notes + add_note_from + add_note_to + end + + def close_issue + close_service = Issues::CloseService.new(old_project, current_user) + close_service.execute(original_entity, notifications: false, system_note: false) + end + + def new_parent + new_entity.project ? new_entity.project : new_entity.group + end + + def group + if new_entity.project&.group && current_user.can?(:read_group, new_entity.project.group) + new_entity.project.group + end + end + end + end +end |