From e17ac5705dd84ede3ae079051adcb66200457338 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Mon, 10 Jul 2017 14:58:23 -0700 Subject: Add a simple mode to merge request API 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 --- changelogs/unreleased/sh-add-mr-simple-mode.yml | 4 ++++ doc/api/merge_requests.md | 1 + lib/api/entities.rb | 7 +++++++ lib/api/merge_requests.rb | 25 ++++++++++++++++++++----- spec/requests/api/merge_requests_spec.rb | 16 ++++++++++++++++ 5 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 changelogs/unreleased/sh-add-mr-simple-mode.yml 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) -- cgit v1.2.1