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
-
-
-
-
- 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:
- `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
......@@ -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
......@@ -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
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