Commit 6cbffb8a authored by Rémy Coutable's avatar Rémy Coutable

Merge branch '50559-add-milestone-progress-to-api' into 'master'

Add milestone progress to API

Closes #50559

See merge request gitlab-org/gitlab-ce!25173
parents c0fa62b5 3328f097
---
title: 'API: Expose milestone progress'
merge_request: 25173
author: Robert Schilling
type: added
...@@ -42,6 +42,7 @@ Example Response: ...@@ -42,6 +42,7 @@ Example Response:
"due_date": "2013-11-29", "due_date": "2013-11-29",
"start_date": "2013-11-10", "start_date": "2013-11-10",
"state": "active", "state": "active",
"percentage_complete" : 66,
"updated_at": "2013-10-02T09:24:18Z", "updated_at": "2013-10-02T09:24:18Z",
"created_at": "2013-10-02T09:24:18Z" "created_at": "2013-10-02T09:24:18Z"
} }
......
...@@ -39,6 +39,7 @@ Example Response: ...@@ -39,6 +39,7 @@ Example Response:
"due_date": "2013-11-29", "due_date": "2013-11-29",
"start_date": "2013-11-10", "start_date": "2013-11-10",
"state": "active", "state": "active",
"percentage_complete" : 66,
"updated_at": "2013-10-02T09:24:18Z", "updated_at": "2013-10-02T09:24:18Z",
"created_at": "2013-10-02T09:24:18Z" "created_at": "2013-10-02T09:24:18Z"
} }
......
...@@ -501,6 +501,9 @@ module API ...@@ -501,6 +501,9 @@ module API
expose :state, :created_at, :updated_at expose :state, :created_at, :updated_at
expose :due_date expose :due_date
expose :start_date expose :start_date
expose :percentage_complete do |milestone, options|
milestone.percent_complete(options[:current_user])
end
expose :web_url do |milestone, _options| expose :web_url do |milestone, _options|
Gitlab::UrlBuilder.build(milestone) Gitlab::UrlBuilder.build(milestone)
......
...@@ -35,19 +35,19 @@ module API ...@@ -35,19 +35,19 @@ module API
milestones = filter_by_iid(milestones, params[:iids]) if params[:iids].present? milestones = filter_by_iid(milestones, params[:iids]) if params[:iids].present?
milestones = filter_by_search(milestones, params[:search]) if params[:search] milestones = filter_by_search(milestones, params[:search]) if params[:search]
present paginate(milestones), with: Entities::Milestone present paginate(milestones), with: Entities::Milestone, current_user: current_user
end end
def get_milestone_for(parent) def get_milestone_for(parent)
milestone = parent.milestones.find(params[:milestone_id]) milestone = parent.milestones.find(params[:milestone_id])
present milestone, with: Entities::Milestone present milestone, with: Entities::Milestone, current_user: current_user
end end
def create_milestone_for(parent) def create_milestone_for(parent)
milestone = ::Milestones::CreateService.new(parent, current_user, declared_params).execute milestone = ::Milestones::CreateService.new(parent, current_user, declared_params).execute
if milestone.valid? if milestone.valid?
present milestone, with: Entities::Milestone present milestone, with: Entities::Milestone, current_user: current_user
else else
render_api_error!("Failed to create milestone #{milestone.errors.messages}", 400) render_api_error!("Failed to create milestone #{milestone.errors.messages}", 400)
end end
...@@ -60,7 +60,7 @@ module API ...@@ -60,7 +60,7 @@ module API
milestone = ::Milestones::UpdateService.new(parent, current_user, milestone_params).execute(milestone) milestone = ::Milestones::UpdateService.new(parent, current_user, milestone_params).execute(milestone)
if milestone.valid? if milestone.valid?
present milestone, with: Entities::Milestone present milestone, with: Entities::Milestone, current_user: current_user
else else
render_api_error!("Failed to update milestone #{milestone.errors.messages}", 400) render_api_error!("Failed to update milestone #{milestone.errors.messages}", 400)
end end
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
"title": { "type": "string" }, "title": { "type": "string" },
"description": { "type": ["string", "null"] }, "description": { "type": ["string", "null"] },
"state": { "type": "string" }, "state": { "type": "string" },
"percentage_complete": { "type": "integer" },
"created_at": { "type": "date" }, "created_at": { "type": "date" },
"updated_at": { "type": "date" }, "updated_at": { "type": "date" },
"start_date": { "type": "date" }, "start_date": { "type": "date" },
......
...@@ -8,12 +8,17 @@ shared_examples_for 'group and project milestones' do |route_definition| ...@@ -8,12 +8,17 @@ shared_examples_for 'group and project milestones' do |route_definition|
describe "GET #{route_definition}" do describe "GET #{route_definition}" do
it 'returns milestones list' do it 'returns milestones list' do
create(:issue, project: project, milestone: milestone)
create(:closed_issue, project: project, milestone: milestone)
create(:closed_issue, project: project, milestone: milestone)
get api(route, user) get api(route, user)
expect(response).to have_gitlab_http_status(200) expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers expect(response).to include_pagination_headers
expect(json_response).to be_an Array expect(json_response).to be_an Array
expect(json_response.first['title']).to eq(milestone.title) expect(json_response.first['title']).to eq(milestone.title)
expect(json_response.first['percentage_complete']).to eq(66)
end end
it 'returns a 401 error if user not authenticated' do it 'returns a 401 error if user not authenticated' do
......
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