summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-10-04 17:41:00 -0300
committerPhil Hughes <me@iamphill.com>2016-10-06 11:00:01 +0100
commit97ec0c05f66e40a6de6620efcf5c92b7c2979f95 (patch)
tree526b5f675205be58ed0a0ac32a09af6cc250913b
parente7a4bbb04a86259a569f6ac239ecb35ad36f39b5 (diff)
downloadgitlab-ce-97ec0c05f66e40a6de6620efcf5c92b7c2979f95.tar.gz
Add service to create a new issue in a board list
-rw-r--r--app/controllers/projects/boards/issues_controller.rb29
-rw-r--r--app/services/boards/issues/create_service.rb16
-rw-r--r--spec/services/boards/issues/create_service_spec.rb33
3 files changed, 67 insertions, 11 deletions
diff --git a/app/controllers/projects/boards/issues_controller.rb b/app/controllers/projects/boards/issues_controller.rb
index fea7a35232d..095af6c35eb 100644
--- a/app/controllers/projects/boards/issues_controller.rb
+++ b/app/controllers/projects/boards/issues_controller.rb
@@ -10,23 +10,21 @@ module Projects
issues = issues.page(params[:page])
render json: {
- issues: issues.as_json(
- only: [:iid, :title, :confidential],
- include: {
- assignee: { only: [:id, :name, :username], methods: [:avatar_url] },
- labels: { only: [:id, :title, :description, :color, :priority], methods: [:text_color] }
- }),
+ issues: serialize_as_json(issues),
size: issues.total_count
}
end
def create
list = project.board.lists.find(params[:list_id])
+ service = ::Boards::Issues::CreateService.new(project, current_user, issue_params)
+ issue = service.execute(list)
- issue = Issues::CreateService.new(project, current_user, issue_params.merge(request: request)).execute
- issue.labels << list.label if list.label
-
- render json: issue.to_json
+ if issue.valid?
+ render json: serialize_as_json(issue)
+ else
+ render json: issue.errors, status: :unprocessable_entity
+ end
end
def update
@@ -70,7 +68,16 @@ module Projects
end
def issue_params
- params.require(:issue).permit(:title)
+ params.require(:issue).permit(:title).merge(request: request)
+ end
+
+ def serialize_as_json(resource)
+ resource.as_json(
+ only: [:iid, :title, :confidential],
+ include: {
+ assignee: { only: [:id, :name, :username], methods: [:avatar_url] },
+ labels: { only: [:id, :title, :description, :color, :priority], methods: [:text_color] }
+ })
end
end
end
diff --git a/app/services/boards/issues/create_service.rb b/app/services/boards/issues/create_service.rb
new file mode 100644
index 00000000000..3701afd441f
--- /dev/null
+++ b/app/services/boards/issues/create_service.rb
@@ -0,0 +1,16 @@
+module Boards
+ module Issues
+ class CreateService < Boards::BaseService
+ def execute(list)
+ params.merge!(label_ids: [list.label_id])
+ create_issue
+ end
+
+ private
+
+ def create_issue
+ ::Issues::CreateService.new(project, current_user, params).execute
+ end
+ end
+ end
+end
diff --git a/spec/services/boards/issues/create_service_spec.rb b/spec/services/boards/issues/create_service_spec.rb
new file mode 100644
index 00000000000..33e10e79f6d
--- /dev/null
+++ b/spec/services/boards/issues/create_service_spec.rb
@@ -0,0 +1,33 @@
+require 'spec_helper'
+
+describe Boards::Issues::CreateService, services: true do
+ describe '#execute' do
+ let(:project) { create(:project_with_board) }
+ let(:board) { project.board }
+ let(:user) { create(:user) }
+ let(:label) { create(:label, project: project, name: 'in-progress') }
+ let!(:list) { create(:list, board: board, label: label, position: 0) }
+
+ subject(:service) { described_class.new(project, user, title: 'New issue') }
+
+ before do
+ project.team << [user, :developer]
+ end
+
+ it 'delegates the create proceedings to Issues::CreateService' do
+ expect_any_instance_of(Issues::CreateService).to receive(:execute).once
+
+ service.execute(list)
+ end
+
+ it 'creates a new issue' do
+ expect { service.execute(list) }.to change(project.issues, :count).by(1)
+ end
+
+ it 'adds the label of the list to the issue' do
+ issue = service.execute(list)
+
+ expect(issue.labels).to eq [label]
+ end
+ end
+end