Commit 02c5077f authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

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
parents 635f62be e03f1af0
...@@ -48,7 +48,7 @@ v 7.8.0 ...@@ -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)
- -
- -
- -
......
...@@ -72,3 +72,16 @@ Parameters: ...@@ -72,3 +72,16 @@ Parameters:
- `description` (optional) - The description of a milestone - `description` (optional) - The description of a milestone
- `due_date` (optional) - The due date of the milestone - `due_date` (optional) - The due date of the milestone
- `state_event` (optional) - The state event of the milestone (close|activate) - `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
...@@ -75,6 +75,21 @@ module API ...@@ -75,6 +75,21 @@ module API
render_api_error!("Failed to update milestone #{milestone.errors.messages}", 400) render_api_error!("Failed to update milestone #{milestone.errors.messages}", 400)
end end
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 end
end end
...@@ -8,48 +8,48 @@ describe API::API, api: true do ...@@ -8,48 +8,48 @@ describe API::API, api: true do
before { project.team << [user, :developer] } before { project.team << [user, :developer] }
describe "GET /projects/:id/milestones" do describe 'GET /projects/:id/milestones' do
it "should return project milestones" do it 'should return project milestones' do
get api("/projects/#{project.id}/milestones", user) get api("/projects/#{project.id}/milestones", user)
response.status.should == 200 response.status.should == 200
json_response.should be_an Array json_response.should be_an Array
json_response.first['title'].should == milestone.title json_response.first['title'].should == milestone.title
end 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") get api("/projects/#{project.id}/milestones")
response.status.should == 401 response.status.should == 401
end end
end end
describe "GET /projects/:id/milestones/:milestone_id" do describe 'GET /projects/:id/milestones/:milestone_id' do
it "should return a project milestone by id" do it 'should return a project milestone by id' do
get api("/projects/#{project.id}/milestones/#{milestone.id}", user) get api("/projects/#{project.id}/milestones/#{milestone.id}", user)
response.status.should == 200 response.status.should == 200
json_response['title'].should == milestone.title json_response['title'].should == milestone.title
json_response['iid'].should == milestone.iid json_response['iid'].should == milestone.iid
end 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}") get api("/projects/#{project.id}/milestones/#{milestone.id}")
response.status.should == 401 response.status.should == 401
end 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) get api("/projects/#{project.id}/milestones/1234", user)
response.status.should == 404 response.status.should == 404
end end
end end
describe "POST /projects/:id/milestones" do describe 'POST /projects/:id/milestones' do
it "should create a new project milestone" do it 'should create a new project milestone' do
post api("/projects/#{project.id}/milestones", user), title: 'new milestone' post api("/projects/#{project.id}/milestones", user), title: 'new milestone'
response.status.should == 201 response.status.should == 201
json_response['title'].should == 'new milestone' json_response['title'].should == 'new milestone'
json_response['description'].should be_nil json_response['description'].should be_nil
end 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), post api("/projects/#{project.id}/milestones", user),
title: 'new milestone', description: 'release', due_date: '2013-03-02' title: 'new milestone', description: 'release', due_date: '2013-03-02'
response.status.should == 201 response.status.should == 201
...@@ -57,29 +57,29 @@ describe API::API, api: true do ...@@ -57,29 +57,29 @@ describe API::API, api: true do
json_response['due_date'].should == '2013-03-02' json_response['due_date'].should == '2013-03-02'
end 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) post api("/projects/#{project.id}/milestones", user)
response.status.should == 400 response.status.should == 400
end end
end end
describe "PUT /projects/:id/milestones/:milestone_id" do describe 'PUT /projects/:id/milestones/:milestone_id' do
it "should update a project milestone" do it 'should update a project milestone' do
put api("/projects/#{project.id}/milestones/#{milestone.id}", user), put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
title: 'updated title' title: 'updated title'
response.status.should == 200 response.status.should == 200
json_response['title'].should == 'updated title' json_response['title'].should == 'updated title'
end 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), put api("/projects/#{project.id}/milestones/1234", user),
title: 'updated title' title: 'updated title'
response.status.should == 404 response.status.should == 404
end end
end end
describe "PUT /projects/:id/milestones/:milestone_id to close milestone" do describe 'PUT /projects/:id/milestones/:milestone_id to close milestone' do
it "should update a project milestone" do it 'should update a project milestone' do
put api("/projects/#{project.id}/milestones/#{milestone.id}", user), put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
state_event: 'close' state_event: 'close'
response.status.should == 200 response.status.should == 200
...@@ -88,12 +88,29 @@ describe API::API, api: true do ...@@ -88,12 +88,29 @@ describe API::API, api: true do
end end
end end
describe "PUT /projects/:id/milestones/:milestone_id to test observer on close" 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 it 'should create an activity event when an milestone is closed' do
Event.should_receive(:create) Event.should_receive(:create)
put api("/projects/#{project.id}/milestones/#{milestone.id}", user), put api("/projects/#{project.id}/milestones/#{milestone.id}", user),
state_event: 'close' state_event: 'close'
end end
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 end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment