From b0a901fe0165b00ec00c9b8fa32344a413b316bf Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 16 Aug 2012 14:51:31 -0400 Subject: [PATCH 1/3] Add API for Milestones --- lib/api.rb | 1 + lib/api/milestones.rb | 93 +++++++++++++++++++++++++++++++++++++ spec/api/milestones_spec.rb | 53 +++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 lib/api/milestones.rb create mode 100644 spec/api/milestones_spec.rb diff --git a/lib/api.rb b/lib/api.rb index 3ff3b3836f4..be04701c25d 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -16,5 +16,6 @@ module Gitlab mount Users mount Projects mount Issues + mount Milestones end end diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb new file mode 100644 index 00000000000..3cdb7d9f7d2 --- /dev/null +++ b/lib/api/milestones.rb @@ -0,0 +1,93 @@ +module Gitlab + # Milestones API + class Milestones < Grape::API + before { authenticate! } + + resource :projects do + # Get a list of project milestones + # + # Parameters: + # id (required) - The ID or code name of a project + # Example Request: + # GET /projects/:id/milestones + get ":id/milestones" do + present user_project.milestones, with: Entities::Milestone + end + + # Get a single project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # milestone_id (required) - The ID of a project milestone + # Example Request: + # GET /projects/:id/milestones/:milestone_id + get ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + present @milestone, with: Entities::Milestone + end + + # Create a new project milestone + # + # Parameters: + # id (required) - The ID or code name of the project + # title (required) - The title of the milestone + # description (optional) - The description of the milestone + # due_date (optional) - The due date of the milestone + # closed (optional) - The status of the milestone + # Example Request: + # POST /projects/:id/milestones + post ":id/milestones" do + @milestone = user_project.milestones.new( + title: params[:title], + description: params[:description], + due_date: params[:due_date], + closed: (params[:closed] || false) + ) + + if @milestone.save + present @milestone, with: Entities::Milestone + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Update an existing project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # title (optional) - The title of a milestone + # description (optional) - The description of a milestone + # due_date (optional) - The due date of a milestone + # closed (optional) - The status of the milestone + # Example Request: + # PUT /projects/:id/milestones/:milestone_id + put ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + parameters = { + title: (params[:title] || @milestone.title), + description: (params[:description] || @milestone.description), + due_date: (params[:due_date] || @milestone.due_date), + closed: (params[:closed] || @milestone.closed) + } + + if @milestone.update_attributes(parameters) + present @milestone, with: Entities::Milestone + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Delete a project milestone + # + # Parameters: + # id (required) - The ID or code name of a project + # milestone_id (required) - The ID of a project milestone + # Example Request: + # DELETE /projects/:id/milestones/:milestone_id + delete ":id/milestones/:milestone_id" do + @milestone = user_project.milestones.find(params[:milestone_id]) + @milestone.destroy + end + end + end +end diff --git a/spec/api/milestones_spec.rb b/spec/api/milestones_spec.rb new file mode 100644 index 00000000000..23f19dddcbd --- /dev/null +++ b/spec/api/milestones_spec.rb @@ -0,0 +1,53 @@ +require 'spec_helper' + +describe Gitlab::API do + let(:user) { Factory :user } + let!(:project) { Factory :project, owner: user } + let!(:milestone) { Factory :milestone, project: project } + + before { project.add_access(user, :read) } + + describe "GET /projects/:id/milestones" do + it "should return project milestones" do + get "#{api_prefix}/projects/#{project.code}/milestones?private_token=#{user.private_token}" + response.status.should == 200 + json_response.should be_an Array + json_response.first['title'].should == milestone.title + end + end + + describe "GET /projects/:id/milestones/:milestone_id" do + it "should return a project milestone by id" do + get "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}" + response.status.should == 200 + json_response['title'].should == milestone.title + end + end + + describe "POST /projects/:id/milestones" do + it "should create a new project milestone" do + post "#{api_prefix}/projects/#{project.code}/milestones?private_token=#{user.private_token}", + title: 'new milestone' + response.status.should == 201 + json_response['title'].should == 'new milestone' + json_response['description'].should be_nil + end + end + + describe "PUT /projects/:id/milestones/:milestone_id" do + it "should update a project milestone" do + put "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}", + title: 'updated title' + response.status.should == 200 + json_response['title'].should == 'updated title' + end + end + + describe "DELETE /projects/:id/milestones/:milestone_id" do + it "should delete a project milestone" do + expect { + delete "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}" + }.to change { Milestone.count }.by(-1) + end + end +end From 0f1ca8b3e7454a6fa788f8e57607b95f3195e145 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 22 Aug 2012 13:19:55 -0400 Subject: [PATCH 2/3] Remove DELETE API for Milestones --- lib/api/milestones.rb | 12 ------------ spec/api/milestones_spec.rb | 8 -------- 2 files changed, 20 deletions(-) diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb index 3cdb7d9f7d2..1ddcd1f8c89 100644 --- a/lib/api/milestones.rb +++ b/lib/api/milestones.rb @@ -76,18 +76,6 @@ module Gitlab error!({'message' => '404 Not found'}, 404) end end - - # Delete a project milestone - # - # Parameters: - # id (required) - The ID or code name of a project - # milestone_id (required) - The ID of a project milestone - # Example Request: - # DELETE /projects/:id/milestones/:milestone_id - delete ":id/milestones/:milestone_id" do - @milestone = user_project.milestones.find(params[:milestone_id]) - @milestone.destroy - end end end end diff --git a/spec/api/milestones_spec.rb b/spec/api/milestones_spec.rb index 23f19dddcbd..ba1d15cc842 100644 --- a/spec/api/milestones_spec.rb +++ b/spec/api/milestones_spec.rb @@ -42,12 +42,4 @@ describe Gitlab::API do json_response['title'].should == 'updated title' end end - - describe "DELETE /projects/:id/milestones/:milestone_id" do - it "should delete a project milestone" do - expect { - delete "#{api_prefix}/projects/#{project.code}/milestones/#{milestone.id}?private_token=#{user.private_token}" - }.to change { Milestone.count }.by(-1) - end - end end From b838440f15fbc56d0504162fcff376cacf9c8186 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 22 Aug 2012 13:26:09 -0400 Subject: [PATCH 3/3] Deprecate the DELETE method for Issues API Now returns HTTP Status 405 - http://httpstatus.es/405 Closes #1245 Closes #1264 --- lib/api/issues.rb | 5 ++--- spec/api/issues_spec.rb | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 2abc20ad34e..836c2818544 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -95,7 +95,7 @@ module Gitlab end end - # Delete a project issue + # Delete a project issue (deprecated) # # Parameters: # id (required) - The ID or code name of a project @@ -103,8 +103,7 @@ module Gitlab # Example Request: # DELETE /projects/:id/issues/:issue_id delete ":id/issues/:issue_id" do - @issue = user_project.issues.find(params[:issue_id]) - @issue.destroy + error!({'message' => 'method not allowed'}, 405) end end end diff --git a/spec/api/issues_spec.rb b/spec/api/issues_spec.rb index f6d8e3792c2..62814307bf6 100644 --- a/spec/api/issues_spec.rb +++ b/spec/api/issues_spec.rb @@ -63,9 +63,8 @@ describe Gitlab::API do describe "DELETE /projects/:id/issues/:issue_id" do it "should delete a project issue" do - expect { - delete "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" - }.to change { Issue.count }.by(-1) + delete "#{api_prefix}/projects/#{project.code}/issues/#{issue.id}?private_token=#{user.private_token}" + response.status.should == 405 end end end