summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-01-22 18:31:18 +0000
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-01-22 18:31:18 +0000
commit02c5077fde9551f282763383864c3a87e227d01a (patch)
tree543ff8d94d91022f105721de48f2367f01491617
parent635f62be67a0a0e7cb02df40317e1c58c78738fb (diff)
parente03f1af00a513a15085a69374a84a2f2df4689d1 (diff)
downloadgitlab-ce-02c5077fde9551f282763383864c3a87e227d01a.tar.gz
Merge branch 'feature_api_milestone_issues' into 'master'
API: List issues for a particular milestone # What does this MR do? This MR adds a new API method for retrieving the issues associated with a particular milestone. The resource is described at ":id/milestones/:milestone_id/issues", returning a simple array of issues. I've picked up gitlab-org/gitlab-ce!113 and fixed the test for it. From the original MR: This feature was motivated by an in-house project for reporting--for large projects, retrieving and filtering the entire issue list by milestone was becoming too slow, particularly when pagination required multiple requests. While this resource also uses pagination, it allows the consumer to limit reporting to the particular milestone they are interested in. @dblessing Please take a look :) See merge request !308
-rw-r--r--CHANGELOG2
-rw-r--r--doc/api/milestones.md13
-rw-r--r--lib/api/milestones.rb15
-rw-r--r--spec/requests/api/milestones_spec.rb53
4 files changed, 64 insertions, 19 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 79b2f094554..9ba7f7c99a6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -48,7 +48,7 @@ v 7.8.0
-
-
-
- -
+ - Add a new API function that retrieves all issues assigned to a single milestone (Justin Whear and Hannes Rosenögger)
-
-
-
diff --git a/doc/api/milestones.md b/doc/api/milestones.md
index 2f525327504..d48b3bcce8a 100644
--- a/doc/api/milestones.md
+++ b/doc/api/milestones.md
@@ -72,3 +72,16 @@ Parameters:
- `description` (optional) - The description of a milestone
- `due_date` (optional) - The due date of the milestone
- `state_event` (optional) - The state event of the milestone (close|activate)
+
+## Get all issues assigned to a single milestone
+
+Gets all issues assigned to a single project milestone.
+
+```
+GET /projects/:id/milestones/:milestone_id/issues
+```
+
+Parameters:
+
+- `id` (required) - The ID of a project
+- `milestone_id` (required) - The ID of a project milestone
diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb
index 2ea49359df0..c5cd73943fb 100644
--- a/lib/api/milestones.rb
+++ b/lib/api/milestones.rb
@@ -75,6 +75,21 @@ module API
render_api_error!("Failed to update milestone #{milestone.errors.messages}", 400)
end
end
+
+ # Get all issues for a single project milestone
+ #
+ # Parameters:
+ # id (required) - The ID of a project
+ # milestone_id (required) - The ID of a project milestone
+ # Example Request:
+ # GET /projects/:id/milestones/:milestone_id/issues
+ get ":id/milestones/:milestone_id/issues" do
+ authorize! :read_milestone, user_project
+
+ @milestone = user_project.milestones.find(params[:milestone_id])
+ present paginate(@milestone.issues), with: Entities::Issue
+ end
+
end
end
end
diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb
index f0619a1c801..647033309bd 100644
--- a/spec/requests/api/milestones_spec.rb
+++ b/spec/requests/api/milestones_spec.rb
@@ -8,48 +8,48 @@ describe API::API, api: true do
before { project.team << [user, :developer] }
- describe "GET /projects/:id/milestones" do
- it "should return project milestones" do
+ describe 'GET /projects/:id/milestones' do
+ it 'should return project milestones' do
get api("/projects/#{project.id}/milestones", user)
response.status.should == 200
json_response.should be_an Array
json_response.first['title'].should == milestone.title
end
- it "should return a 401 error if user not authenticated" do
+ it 'should return a 401 error if user not authenticated' do
get api("/projects/#{project.id}/milestones")
response.status.should == 401
end
end
- describe "GET /projects/:id/milestones/:milestone_id" do
- it "should return a project milestone by id" do
+ describe 'GET /projects/:id/milestones/:milestone_id' do
+ it 'should return a project milestone by id' do
get api("/projects/#{project.id}/milestones/#{milestone.id}", user)
response.status.should == 200
json_response['title'].should == milestone.title
json_response['iid'].should == milestone.iid
end
- it "should return 401 error if user not authenticated" do
+ it 'should return 401 error if user not authenticated' do
get api("/projects/#{project.id}/milestones/#{milestone.id}")
response.status.should == 401
end
- it "should return a 404 error if milestone id not found" do
+ it 'should return a 404 error if milestone id not found' do
get api("/projects/#{project.id}/milestones/1234", user)
response.status.should == 404
end
end
- describe "POST /projects/:id/milestones" do
- it "should create a new project milestone" do
+ describe 'POST /projects/:id/milestones' do
+ it 'should create a new project milestone' do
post api("/projects/#{project.id}/milestones", user), title: 'new milestone'
response.status.should == 201
json_response['title'].should == 'new milestone'
json_response['description'].should be_nil
end
- it "should create a new project milestone with description and due date" do
+ it 'should create a new project milestone with description and due date' do
post api("/projects/#{project.id}/milestones", user),
title: 'new milestone', description: 'release', due_date: '2013-03-02'
response.status.should == 201
@@ -57,29 +57,29 @@ describe API::API, api: true do
json_response['due_date'].should == '2013-03-02'
end
- it "should return a 400 error if title is missing" do
+ it 'should return a 400 error if title is missing' do
post api("/projects/#{project.id}/milestones", user)
response.status.should == 400
end
end
- describe "PUT /projects/:id/milestones/:milestone_id" do
- it "should update a project milestone" do
+ describe 'PUT /projects/:id/milestones/:milestone_id' do
+ it 'should update a project milestone' do
put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
title: 'updated title'
response.status.should == 200
json_response['title'].should == 'updated title'
end
- it "should return a 404 error if milestone id not found" do
+ it 'should return a 404 error if milestone id not found' do
put api("/projects/#{project.id}/milestones/1234", user),
title: 'updated title'
response.status.should == 404
end
end
- describe "PUT /projects/:id/milestones/:milestone_id to close milestone" do
- it "should update a project milestone" do
+ describe 'PUT /projects/:id/milestones/:milestone_id to close milestone' do
+ it 'should update a project milestone' do
put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
state_event: 'close'
response.status.should == 200
@@ -88,12 +88,29 @@ describe API::API, api: true do
end
end
- describe "PUT /projects/:id/milestones/:milestone_id to test observer on close" do
- it "should create an activity event when an milestone is closed" do
+ describe 'PUT /projects/:id/milestones/:milestone_id to test observer on close' do
+ it 'should create an activity event when an milestone is closed' do
Event.should_receive(:create)
put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
state_event: 'close'
end
end
+
+ describe 'GET /projects/:id/milestones/:milestone_id/issues' do
+ before do
+ milestone.issues << create(:issue)
+ end
+ it 'should return project issues for a particular milestone' do
+ get api("/projects/#{project.id}/milestones/#{milestone.id}/issues", user)
+ response.status.should == 200
+ json_response.should be_an Array
+ json_response.first['milestone']['title'].should == milestone.title
+ end
+
+ it 'should return a 401 error if user not authenticated' do
+ get api("/projects/#{project.id}/milestones/#{milestone.id}/issues")
+ response.status.should == 401
+ end
+ end
end