Grapify milestones API
This commit is contained in:
parent
c392b0cc24
commit
f27e972e84
2 changed files with 66 additions and 54 deletions
|
@ -11,19 +11,25 @@ module API
|
||||||
else milestones
|
else milestones
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
params :optional_params do
|
||||||
|
optional :description, type: String, desc: 'The description of the milestone'
|
||||||
|
optional :due_date, type: String, desc: 'The due date of the milestone'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
params do
|
||||||
|
requires :id, type: String, desc: 'The ID of a project'
|
||||||
|
end
|
||||||
resource :projects do
|
resource :projects do
|
||||||
# Get a list of project milestones
|
desc 'Get a list of project milestones' do
|
||||||
#
|
success Entities::Milestone
|
||||||
# Parameters:
|
end
|
||||||
# id (required) - The ID of a project
|
params do
|
||||||
# state (optional) - Return "active" or "closed" milestones
|
optional :state, type: String, values: %w[active closed all], default: 'all',
|
||||||
# Example Request:
|
desc: 'Return "active", "closed", or "all" milestones'
|
||||||
# GET /projects/:id/milestones
|
optional :iid, type: Integer, desc: 'The IID of the milestone'
|
||||||
# GET /projects/:id/milestones?iid=42
|
end
|
||||||
# GET /projects/:id/milestones?state=active
|
|
||||||
# GET /projects/:id/milestones?state=closed
|
|
||||||
get ":id/milestones" do
|
get ":id/milestones" do
|
||||||
authorize! :read_milestone, user_project
|
authorize! :read_milestone, user_project
|
||||||
|
|
||||||
|
@ -34,34 +40,31 @@ module API
|
||||||
present paginate(milestones), with: Entities::Milestone
|
present paginate(milestones), with: Entities::Milestone
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get a single project milestone
|
desc 'Get a single project milestone' do
|
||||||
#
|
success Entities::Milestone
|
||||||
# Parameters:
|
end
|
||||||
# id (required) - The ID of a project
|
params do
|
||||||
# milestone_id (required) - The ID of a project milestone
|
requires :milestone_id, type: Integer, desc: 'The ID of a project milestone'
|
||||||
# Example Request:
|
end
|
||||||
# GET /projects/:id/milestones/:milestone_id
|
|
||||||
get ":id/milestones/:milestone_id" do
|
get ":id/milestones/:milestone_id" do
|
||||||
authorize! :read_milestone, user_project
|
authorize! :read_milestone, user_project
|
||||||
|
|
||||||
@milestone = user_project.milestones.find(params[:milestone_id])
|
milestone = user_project.milestones.find(params[:milestone_id])
|
||||||
present @milestone, with: Entities::Milestone
|
present milestone, with: Entities::Milestone
|
||||||
end
|
end
|
||||||
|
|
||||||
# Create a new project milestone
|
desc 'Create a new project milestone' do
|
||||||
#
|
success Entities::Milestone
|
||||||
# Parameters:
|
end
|
||||||
# id (required) - The ID of the project
|
params do
|
||||||
# title (required) - The title of the milestone
|
requires :title, type: String, desc: 'The title of the milestone'
|
||||||
# description (optional) - The description of the milestone
|
use :optional_params
|
||||||
# due_date (optional) - The due date of the milestone
|
end
|
||||||
# Example Request:
|
|
||||||
# POST /projects/:id/milestones
|
|
||||||
post ":id/milestones" do
|
post ":id/milestones" do
|
||||||
authorize! :admin_milestone, user_project
|
authorize! :admin_milestone, user_project
|
||||||
required_attributes! [:title]
|
milestone_params = declared(params, include_parent_namespaces: false)
|
||||||
attrs = attributes_for_keys [:title, :description, :due_date]
|
|
||||||
milestone = ::Milestones::CreateService.new(user_project, current_user, attrs).execute
|
milestone = ::Milestones::CreateService.new(user_project, current_user, milestone_params).execute
|
||||||
|
|
||||||
if milestone.valid?
|
if milestone.valid?
|
||||||
present milestone, with: Entities::Milestone
|
present milestone, with: Entities::Milestone
|
||||||
|
@ -70,22 +73,23 @@ module API
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Update an existing project milestone
|
desc 'Update an existing project milestone' do
|
||||||
#
|
success Entities::Milestone
|
||||||
# Parameters:
|
end
|
||||||
# id (required) - The ID of a project
|
params do
|
||||||
# milestone_id (required) - The ID of a project milestone
|
requires :milestone_id, type: Integer, desc: 'The ID of a project milestone'
|
||||||
# title (optional) - The title of a milestone
|
optional :title, type: String, desc: 'The title of the milestone'
|
||||||
# description (optional) - The description of a milestone
|
optional :state_event, type: String, values: %w[close activate],
|
||||||
# due_date (optional) - The due date of a milestone
|
desc: 'The state event of the milestone '
|
||||||
# state_event (optional) - The state event of the milestone (close|activate)
|
use :optional_params
|
||||||
# Example Request:
|
at_least_one_of :title, :description, :due_date, :state_event
|
||||||
# PUT /projects/:id/milestones/:milestone_id
|
end
|
||||||
put ":id/milestones/:milestone_id" do
|
put ":id/milestones/:milestone_id" do
|
||||||
authorize! :admin_milestone, user_project
|
authorize! :admin_milestone, user_project
|
||||||
attrs = attributes_for_keys [:title, :description, :due_date, :state_event]
|
milestone_params = declared(params, include_parent_namespaces: false, include_missing: false)
|
||||||
milestone = user_project.milestones.find(params[:milestone_id])
|
|
||||||
milestone = ::Milestones::UpdateService.new(user_project, current_user, attrs).execute(milestone)
|
milestone = user_project.milestones.find(milestone_params.delete(:milestone_id))
|
||||||
|
milestone = ::Milestones::UpdateService.new(user_project, current_user, milestone_params).execute(milestone)
|
||||||
|
|
||||||
if milestone.valid?
|
if milestone.valid?
|
||||||
present milestone, with: Entities::Milestone
|
present milestone, with: Entities::Milestone
|
||||||
|
@ -94,21 +98,20 @@ module API
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get all issues for a single project milestone
|
desc 'Get all issues for a single project milestone' do
|
||||||
#
|
success Entities::Issue
|
||||||
# Parameters:
|
end
|
||||||
# id (required) - The ID of a project
|
params do
|
||||||
# milestone_id (required) - The ID of a project milestone
|
requires :milestone_id, type: Integer, desc: 'The ID of a project milestone'
|
||||||
# Example Request:
|
end
|
||||||
# GET /projects/:id/milestones/:milestone_id/issues
|
|
||||||
get ":id/milestones/:milestone_id/issues" do
|
get ":id/milestones/:milestone_id/issues" do
|
||||||
authorize! :read_milestone, user_project
|
authorize! :read_milestone, user_project
|
||||||
|
|
||||||
@milestone = user_project.milestones.find(params[:milestone_id])
|
milestone = user_project.milestones.find(params[:milestone_id])
|
||||||
|
|
||||||
finder_params = {
|
finder_params = {
|
||||||
project_id: user_project.id,
|
project_id: user_project.id,
|
||||||
milestone_title: @milestone.title
|
milestone_title: milestone.title
|
||||||
}
|
}
|
||||||
|
|
||||||
issues = IssuesFinder.new(current_user, finder_params).execute
|
issues = IssuesFinder.new(current_user, finder_params).execute
|
||||||
|
|
|
@ -123,6 +123,15 @@ describe API::API, api: true do
|
||||||
expect(json_response['title']).to eq('updated title')
|
expect(json_response['title']).to eq('updated title')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'removes a due date if nil is passed' do
|
||||||
|
milestone.update!(due_date: "2016-08-05")
|
||||||
|
|
||||||
|
put api("/projects/#{project.id}/milestones/#{milestone.id}", user), due_date: nil
|
||||||
|
|
||||||
|
expect(response).to have_http_status(200)
|
||||||
|
expect(json_response['due_date']).to be_nil
|
||||||
|
end
|
||||||
|
|
||||||
it 'returns a 404 error if milestone id not found' do
|
it 'returns 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'
|
||||||
|
|
Loading…
Reference in a new issue