summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2017-07-10 14:58:23 -0700
committerStan Hu <stanhu@gmail.com>2017-07-11 06:32:13 -0700
commite17ac5705dd84ede3ae079051adcb66200457338 (patch)
treea7b0000d3dab6c48499bb963e6ec5cfdfeb6e049
parent01dabbd5c94b494a1833c4e0395032cc81f85dce (diff)
downloadgitlab-ce-e17ac5705dd84ede3ae079051adcb66200457338.tar.gz
Add a simple mode to merge request APIsh-add-mr-simple-mode
The current "basic" merge request API still loads too much data. For integrations like the Trello Power-up, we just need the basics. Closes #34920
-rw-r--r--changelogs/unreleased/sh-add-mr-simple-mode.yml4
-rw-r--r--doc/api/merge_requests.md1
-rw-r--r--lib/api/entities.rb7
-rw-r--r--lib/api/merge_requests.rb25
-rw-r--r--spec/requests/api/merge_requests_spec.rb16
5 files changed, 48 insertions, 5 deletions
diff --git a/changelogs/unreleased/sh-add-mr-simple-mode.yml b/changelogs/unreleased/sh-add-mr-simple-mode.yml
new file mode 100644
index 00000000000..0033ca28444
--- /dev/null
+++ b/changelogs/unreleased/sh-add-mr-simple-mode.yml
@@ -0,0 +1,4 @@
+---
+title: Add a simple mode to merge request API
+merge_request:
+author:
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 3dc808c196d..fc68e1ee0cf 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -25,6 +25,7 @@ Parameters:
| `order_by`| string | no | Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` |
| `sort` | string | no | Return requests sorted in `asc` or `desc` order. Default is `desc` |
| `milestone` | string | no | Return merge requests for a specific milestone |
+| `simple` | boolean | no | Returns the `iid`, URL, title, description, and basic state of merge request |
| `labels` | string | no | Return merge requests matching a comma separated list of labels |
| `created_after` | datetime | no | Return merge requests created after the given time (inclusive) |
| `created_before` | datetime | no | Return merge requests created before the given time (inclusive) |
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 945f2821d72..47742a164fc 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -314,6 +314,13 @@ module API
expose :id
end
+ class MergeRequestSimple < ProjectEntity
+ expose :title
+ expose :web_url do |merge_request, options|
+ Gitlab::UrlBuilder.build(merge_request)
+ end
+ end
+
class MergeRequestBasic < ProjectEntity
expose :target_branch, :source_branch
expose :upvotes do |merge_request, options|
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index 1a3fdb66f3f..aace6553e2e 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -44,9 +44,14 @@ module API
args[:label_name] = args.delete(:labels)
merge_requests = MergeRequestsFinder.new(current_user, args).execute
- merge_requests = merge_requests.reorder(args[:order_by] => args[:sort])
- paginate(merge_requests)
- .preload(:notes, :target_project, :author, :assignee, :milestone, :merge_request_diff, :labels)
+ .reorder(args[:order_by] => args[:sort])
+ merge_requests = paginate(merge_requests)
+ .preload(:target_project)
+
+ return merge_requests if params[:simple]
+
+ merge_requests
+ .preload(:notes, :author, :assignee, :milestone, :merge_request_diff, :labels)
end
params :optional_params_ce do
@@ -77,15 +82,25 @@ module API
optional :labels, type: String, desc: 'Comma-separated list of label names'
optional :created_after, type: DateTime, desc: 'Return merge requests created after the specified time'
optional :created_before, type: DateTime, desc: 'Return merge requests created before the specified time'
+ optional :simple, type: Boolean, default: false, desc: 'Returns the `iid`, URL, title, description, and basic state of merge request'
use :pagination
end
get ":id/merge_requests" do
authorize! :read_merge_request, user_project
merge_requests = find_merge_requests(project_id: user_project.id)
- issuable_metadata = issuable_meta_data(merge_requests, 'MergeRequest')
- present merge_requests, with: Entities::MergeRequestBasic, current_user: current_user, project: user_project, issuable_metadata: issuable_metadata
+ options = { with: Entities::MergeRequestBasic,
+ current_user: current_user,
+ project: user_project }
+
+ if params[:simple]
+ options[:with] = Entities::MergeRequestSimple
+ else
+ options[:issuable_metadata] = issuable_meta_data(merge_requests, 'MergeRequest')
+ end
+
+ present merge_requests, options
end
desc 'Create a merge request' do
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 360a82196a8..850c22ff07f 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -69,6 +69,22 @@ describe API::MergeRequests do
expect(json_response.first['merge_commit_sha']).to eq(merge_request_merged.merge_commit_sha)
end
+ it "returns an array of all merge_requests using simple mode" do
+ get api("/projects/#{project.id}/merge_requests?simple=true", user)
+
+ expect(response).to have_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response.last.keys).to match_array(%w(id iid title web_url created_at description project_id state updated_at))
+ expect(json_response).to be_an Array
+ expect(json_response.length).to eq(3)
+ expect(json_response.last['iid']).to eq(merge_request.iid)
+ expect(json_response.last['title']).to eq(merge_request.title)
+ expect(json_response.last).to have_key('web_url')
+ expect(json_response.first['iid']).to eq(merge_request_merged.iid)
+ expect(json_response.first['title']).to eq(merge_request_merged.title)
+ expect(json_response.first).to have_key('web_url')
+ end
+
it "returns an array of all merge_requests" do
get api("/projects/#{project.id}/merge_requests?state", user)