From 06a5174c69cf7a4dc122fb1258fd1ea65043f1a1 Mon Sep 17 00:00:00 2001
From: Eugenia Grieff <egrieff@gitlab.com>
Date: Fri, 16 Aug 2019 16:10:50 +0000
Subject: [PATCH] Update epic start and due date when adding issues

- Update an epic start and due dates (if these are not fixed)
when adding this epic to a new issue with milestone
- Cover the case that uses quick actions in the issue
description to add the epic
---
 app/services/issues/create_service.rb         |  2 ++
 ee/app/services/ee/issues/create_service.rb   | 32 +++++++++++++++++
 ...-t-work-when-using-epic-in-a-new-issue.yml |  5 +++
 .../services/issues/create_service_spec.rb    | 35 ++++++++++++++++++-
 4 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 ee/app/services/ee/issues/create_service.rb
 create mode 100644 ee/changelogs/unreleased/11750-epic-dates-from-milestones-don-t-work-when-using-epic-in-a-new-issue.yml

diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index 5793a15e1bc4..8d1df0d87a71 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -49,3 +49,5 @@ def user_agent_detail_service
     end
   end
 end
+
+Issues::CreateService.prepend_if_ee('EE::Issues::CreateService')
diff --git a/ee/app/services/ee/issues/create_service.rb b/ee/app/services/ee/issues/create_service.rb
new file mode 100644
index 000000000000..549d2fdae3f2
--- /dev/null
+++ b/ee/app/services/ee/issues/create_service.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module EE
+  module Issues
+    module CreateService
+      extend ::Gitlab::Utils::Override
+
+      override :before_create
+      def before_create(issue)
+        handle_issue_epic_link(issue)
+
+        super
+      end
+
+      def handle_issue_epic_link(issue)
+        return unless params.key?(:epic)
+
+        epic_param = params.delete(:epic)
+
+        if epic_param
+          EpicIssues::CreateService.new(epic_param, current_user, { target_issuable: issue }).execute
+        else
+          link = EpicIssue.find_by_issue_id(issue.id)
+
+          return unless link
+
+          EpicIssues::DestroyService.new(link, current_user).execute
+        end
+      end
+    end
+  end
+end
diff --git a/ee/changelogs/unreleased/11750-epic-dates-from-milestones-don-t-work-when-using-epic-in-a-new-issue.yml b/ee/changelogs/unreleased/11750-epic-dates-from-milestones-don-t-work-when-using-epic-in-a-new-issue.yml
new file mode 100644
index 000000000000..9e541c9b71dc
--- /dev/null
+++ b/ee/changelogs/unreleased/11750-epic-dates-from-milestones-don-t-work-when-using-epic-in-a-new-issue.yml
@@ -0,0 +1,5 @@
+---
+title: Update epic dates when creating an issue that adds the epic using commands
+merge_request: 15062
+author:
+type: fixed
diff --git a/ee/spec/services/issues/create_service_spec.rb b/ee/spec/services/issues/create_service_spec.rb
index 7611049470c8..7f066b80b1fb 100644
--- a/ee/spec/services/issues/create_service_spec.rb
+++ b/ee/spec/services/issues/create_service_spec.rb
@@ -2,7 +2,6 @@
 
 describe Issues::CreateService do
   let(:project) { create(:project) }
-
   let(:opts) do
     {
       title: 'Awesome issue',
@@ -30,6 +29,7 @@
     let(:reporter) { create(:user) }
 
     before do
+      stub_licensed_features(epics: true)
       project.add_reporter(reporter)
     end
 
@@ -39,5 +39,38 @@
       expect(issue).to be_persisted
       expect(issue.weight).to eq(9)
     end
+
+    context 'when epics are enabled' do
+      let(:group) { create(:group) }
+      let(:project1) { create(:project, group: group) }
+      let(:epic) { create(:epic, group: group, start_date_is_fixed: false, due_date_is_fixed: false) }
+
+      before do
+        stub_licensed_features(epics: true)
+        group.add_reporter(reporter)
+        project1.add_reporter(reporter)
+      end
+
+      context 'when using quick actions' do
+        context 'with epic and milestone in commands only' do
+          let(:milestone) { create(:milestone, group: group, start_date: Date.today, due_date: 7.days.from_now) }
+          let(:opts) do
+            {
+              title: 'Awesome issue',
+              description: %(/epic #{epic.to_reference}\n/milestone #{milestone.to_reference}")
+            }
+          end
+
+          it 'sets epic and milestone to issuable and update epic start and due date' do
+            issue = described_class.new(project1, reporter, opts).execute
+
+            expect(issue.milestone).to eq(milestone)
+            expect(issue.epic).to eq(epic)
+            expect(epic.reload.start_date).to eq(milestone.start_date)
+            expect(epic.due_date).to eq(milestone.due_date)
+          end
+        end
+      end
+    end
   end
 end
-- 
GitLab