summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Drozdov <idrozdov@gitlab.com>2019-07-10 12:57:28 +0300
committerIgor Drozdov <idrozdov@gitlab.com>2019-07-10 15:06:38 +0300
commit478950e64ed2cdb5e5a70f907c38a13bacb39daa (patch)
tree7c6bbb1c9d58404268293d45ad22493f5149605f
parent775910d3726007c94c74e49f3f243464e50d65f0 (diff)
downloadgitlab-ce-id-auto-complete-can-merge.tar.gz
Add can_merge option to autocomplete responseid-auto-complete-can-merge
It's used only if merge_request_iid param is provided
-rw-r--r--app/controllers/autocomplete_controller.rb2
-rw-r--r--app/serializers/user_for_merge_request_entity.rb7
-rw-r--r--app/serializers/user_serializer.rb9
-rw-r--r--changelogs/unreleased/id-auto-complete-can-merge.yml5
-rw-r--r--spec/serializers/user_serializer_spec.rb31
5 files changed, 53 insertions, 1 deletions
diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb
index 091327931c2..f111c7ca8cc 100644
--- a/app/controllers/autocomplete_controller.rb
+++ b/app/controllers/autocomplete_controller.rb
@@ -16,7 +16,7 @@ class AutocompleteController < ApplicationController
.new(params: params, current_user: current_user, project: project, group: group)
.execute
- render json: UserSerializer.new.represent(users)
+ render json: UserSerializer.new(params).represent(users, project: project)
end
def user
diff --git a/app/serializers/user_for_merge_request_entity.rb b/app/serializers/user_for_merge_request_entity.rb
new file mode 100644
index 00000000000..86a23bd0420
--- /dev/null
+++ b/app/serializers/user_for_merge_request_entity.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class UserForMergeRequestEntity < UserEntity
+ expose :can_merge do |user, options|
+ options[:merge_request].can_be_merged_by?(user)
+ end
+end
diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index 2111e1b5667..a32bf804084 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -2,4 +2,13 @@
class UserSerializer < BaseSerializer
entity UserEntity
+
+ def represent(user, opts = {}, entity = nil)
+ if params[:merge_request_iid]
+ merge_request = opts[:project].merge_requests.find_by_iid(params[:merge_request_iid])
+ super(user, opts.merge(merge_request: merge_request), UserForMergeRequestEntity)
+ else
+ super
+ end
+ end
end
diff --git a/changelogs/unreleased/id-auto-complete-can-merge.yml b/changelogs/unreleased/id-auto-complete-can-merge.yml
new file mode 100644
index 00000000000..808eba0c34f
--- /dev/null
+++ b/changelogs/unreleased/id-auto-complete-can-merge.yml
@@ -0,0 +1,5 @@
+---
+title: Add can_merge option to autocomplete response
+merge_request: 30563
+author:
+type: added
diff --git a/spec/serializers/user_serializer_spec.rb b/spec/serializers/user_serializer_spec.rb
new file mode 100644
index 00000000000..85ff04c661c
--- /dev/null
+++ b/spec/serializers/user_serializer_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe UserSerializer do
+ let(:user1) { create(:user) }
+ let(:user2) { create(:user) }
+
+ context 'serializer with merge request context' do
+ let(:project) { create(:project) }
+ let(:merge_request) { create(:merge_request) }
+ let(:serializer) { described_class.new(merge_request_iid: merge_request.iid) }
+
+ before do
+ allow(project).to(
+ receive_message_chain(:merge_requests, :find_by_iid)
+ .with(merge_request.iid).and_return(merge_request)
+ )
+
+ allow(merge_request).to receive(:can_be_merged_by?).with(user1).and_return(true)
+ allow(merge_request).to receive(:can_be_merged_by?).with(user2).and_return(false)
+ end
+
+ it 'returns a user with can_merge option' do
+ serialized_user1, serialized_user2 = serializer.represent([user1, user2], project: project).as_json
+
+ expect(serialized_user1).to include("id" => user1.id, "can_merge" => true)
+ expect(serialized_user2).to include("id" => user2.id, "can_merge" => false)
+ end
+ end
+end