Commit 5b9844e2 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'fix-boards-api-update' into 'master'

Fix updating boards through API

Closes #11440

See merge request gitlab-org/gitlab-ee!12303
parents a67d92d1 c0298a69
......@@ -5,6 +5,8 @@ module EE
module BaseService
# rubocop: disable CodeReuse/ActiveRecord
def set_assignee
return unless params.key?(:assignee_id)
assignee = ::User.find_by(id: params.delete(:assignee_id))
params.merge!(assignee: assignee)
end
......@@ -12,9 +14,9 @@ module EE
# rubocop: disable CodeReuse/ActiveRecord
def set_milestone
milestone_id = params[:milestone_id]
return unless params.key?(:milestone_id)
return unless milestone_id
milestone_id = params[:milestone_id]
return if [::Milestone::None.id,
::Milestone::Upcoming.id,
......@@ -35,10 +37,10 @@ module EE
# rubocop: enable CodeReuse/ActiveRecord
def set_labels
if params[:label_ids]
params[:label_ids] = labels_service.filter_labels_ids_in_param(:label_ids)
elsif params[:labels]
params[:label_ids] = labels_service.find_or_create_by_titles.map(&:id)
if params.key?(:label_ids)
params[:label_ids] = (labels_service.filter_labels_ids_in_param(:label_ids) || [])
elsif params.key?(:labels)
params[:label_ids] = (labels_service.find_or_create_by_titles.map(&:id) || [])
end
end
......
---
title: Fix updating board attributes through API
merge_request:
author:
type: fixed
......@@ -17,7 +17,7 @@ module EE
end
def update_board
service = ::Boards::UpdateService.new(board_parent, current_user, declared_params)
service = ::Boards::UpdateService.new(board_parent, current_user, declared_params(include_missing: false))
service.execute(board)
if board.valid?
......
......@@ -4,7 +4,7 @@ describe API::Boards do
set(:user) { create(:user) }
set(:board_parent) { create(:project, :public, creator_id: user.id, namespace: user.namespace ) }
set(:milestone) { create(:milestone, project: board_parent) }
set(:board) { create(:board, project: board_parent, milestone: milestone) }
set(:board) { create(:board, project: board_parent, milestone: milestone, assignee: user) }
it_behaves_like 'multiple and scoped issue boards', "/projects/:id/boards"
......
......@@ -33,6 +33,32 @@ shared_examples_for 'multiple and scoped issue boards' do |route_definition|
expect(board.weight).to eq(4)
expect(board.labels.map(&:title)).to contain_exactly('foo', 'bar')
end
it 'does not remove missing attributes from the board' do
expect { put api(url, user), params: { name: 'new name' } }
.to not_change { board.reload.assignee }
.and not_change { board.reload.milestone }
.and not_change { board.reload.weight }
.and not_change { board.reload.labels.map(&:title).sort }
expect(response).to have_gitlab_http_status(200)
expect(response).to match_response_schema('public_api/v4/board', dir: "ee")
end
it 'allows removing optional attributes' do
put api(url, user), params: { name: 'new name', assignee_id: nil, milestone_id: nil, weight: nil, labels: nil }
expect(response).to have_gitlab_http_status(200)
expect(response).to match_response_schema('public_api/v4/board', dir: "ee")
board.reload
expect(board.name).to eq('new name')
expect(board.assignee).to be_nil
expect(board.milestone).to be_nil
expect(board.weight).to be_nil
expect(board.labels).to be_empty
end
end
describe "DELETE #{route_definition}/:board_id" do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment