From 0728588c3424fd7e75ca3c45ad1ea84063437311 Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Wed, 6 Apr 2016 13:03:07 +0200 Subject: API: Ability to filter milestones by state --- CHANGELOG | 1 + doc/api/milestones.md | 3 +++ lib/api/milestones.rb | 20 ++++++++++++++++++-- spec/requests/api/milestones_spec.rb | 17 +++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a23c8a54af1..531f3607297 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -25,6 +25,7 @@ v 8.7.0 (unreleased) - Build status notifications - API: Ability to retrieve a specific tag (Robert Schilling) - API: Expose user location (Robert Schilling) + - API: Ability to milter milestones by state `active` and `closed` (Robert Schilling) v 8.6.5 (unreleased) - Check permissions when user attempts to import members from another project diff --git a/doc/api/milestones.md b/doc/api/milestones.md index a6828728264..4d94d7f3e2c 100644 --- a/doc/api/milestones.md +++ b/doc/api/milestones.md @@ -7,6 +7,8 @@ Returns a list of project milestones. ``` GET /projects/:id/milestones GET /projects/:id/milestones?iid=42 +GET /projects/:id/milestones?state=active +GET /projects/:id/milestones?state=closed ``` ```json @@ -29,6 +31,7 @@ Parameters: - `id` (required) - The ID of a project - `iid` (optional) - Return the milestone having the given `iid` +- `state` (optional) - Return "active" or "closed" milestones ## Get single milestone diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb index c5cd73943fb..39efa1b176b 100644 --- a/lib/api/milestones.rb +++ b/lib/api/milestones.rb @@ -3,17 +3,33 @@ module API class Milestones < Grape::API before { authenticate! } + helpers do + def filter_milestones_state(milestones, state) + case state + when 'active' then milestones.active + when 'closed' then milestones.closed + else milestones + end + end + end + resource :projects do # Get a list of project milestones # # Parameters: - # id (required) - The ID of a project + # id (required) - The ID of a project + # state (optional) - Return "active" or "closed" milestones # Example Request: # GET /projects/:id/milestones + # GET /projects/:id/milestones?state=active + # GET /projects/:id/milestones?state=closed get ":id/milestones" do authorize! :read_milestone, user_project - present paginate(user_project.milestones), with: Entities::Milestone + milestones = user_project.milestones + milestones = filter_milestones_state(milestones, params[:state]) unless params[:state].nil? + + present paginate(milestones), with: Entities::Milestone end # Get a single project milestone diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb index db0f6e3c0f5..281d2b25bf5 100644 --- a/spec/requests/api/milestones_spec.rb +++ b/spec/requests/api/milestones_spec.rb @@ -4,6 +4,7 @@ describe API::API, api: true do include ApiHelpers let(:user) { create(:user) } let!(:project) { create(:project, namespace: user.namespace ) } + let!(:closed_milestone) { create(:closed_milestone, project: project, state: :closed) } let!(:milestone) { create(:milestone, project: project) } before { project.team << [user, :developer] } @@ -20,6 +21,22 @@ describe API::API, api: true do get api("/projects/#{project.id}/milestones") expect(response.status).to eq(401) end + + it 'should return an array of active milestones' do + get api("/projects/#{project.id}/milestones?state=active", user) + expect(response.status).to eq(200) + expect(json_response).to be_an Array + expect(json_response.length).to eq(1) + expect(json_response.first['id']).to eq(milestone.id) + end + + it 'should return an array of closed milestones' do + get api("/projects/#{project.id}/milestones?state=closed", user) + expect(response.status).to eq(200) + expect(json_response).to be_an Array + expect(json_response.length).to eq(1) + expect(json_response.first['id']).to eq(closed_milestone.id) + end end describe 'GET /projects/:id/milestones/:milestone_id' do -- cgit v1.2.1