summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNihad Abbasov <narkoz.2008@gmail.com>2012-06-29 06:34:08 -0700
committerNihad Abbasov <narkoz.2008@gmail.com>2012-06-29 06:34:08 -0700
commit378dc55d29a97447315c6181f678cf933afbbb78 (patch)
tree999cfa2b39fb4b338cac01e98cb72e451fce5ddd
parent1d2c98186014cedc01f04382d507a34a71008ab1 (diff)
downloadgitlab-ce-378dc55d29a97447315c6181f678cf933afbbb78.tar.gz
add project snippets API
-rw-r--r--lib/api/entities.rb6
-rw-r--r--lib/api/projects.rb53
-rw-r--r--spec/api/projects_spec.rb28
3 files changed, 87 insertions, 0 deletions
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 44a43985602..7129e761a52 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -19,5 +19,11 @@ module Gitlab
class ProjectRepositoryTags < Grape::Entity
expose :name, :commit
end
+
+ class ProjectSnippet < Grape::Entity
+ expose :id, :title, :file_name
+ expose :author, :using => Entities::User
+ expose :expires_at, :updated_at, :created_at
+ end
end
end
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 670d3d97acc..815092f4de5 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -45,6 +45,59 @@ module Gitlab
@project = current_user.projects.find_by_code(params[:id])
present @project.repo.tags.sort_by(&:name).reverse, :with => Entities::ProjectRepositoryTags
end
+
+ # Get a project snippet
+ #
+ # Parameters:
+ # id (required) - The code of a project
+ # snippet_id (required) - The ID of a project snippet
+ # Example Request:
+ # GET /projects/:id/snippets/:snippet_id
+ get ":id/snippets/:snippet_id" do
+ @project = current_user.projects.find_by_code(params[:id])
+ @snippet = @project.snippets.find(params[:snippet_id])
+ present @snippet, :with => Entities::ProjectSnippet
+ end
+
+ # Create a new project snippet
+ #
+ # Parameters:
+ # id (required) - The code name of a project
+ # title (required) - The title of a snippet
+ # file_name (required) - The name of a snippet file
+ # lifetime (optional) - The expiration date of a snippet
+ # code (required) - The content of a snippet
+ # Example Request:
+ # POST /projects/:id/snippets
+ post ":id/snippets" do
+ @project = current_user.projects.find_by_code(params[:id])
+ @snippet = @project.snippets.new(
+ :title => params[:title],
+ :file_name => params[:file_name],
+ :expires_at => params[:lifetime],
+ :content => params[:code]
+ )
+ @snippet.author = current_user
+
+ if @snippet.save
+ present @snippet, :with => Entities::ProjectSnippet
+ else
+ error!({'message' => '404 Not found'}, 404)
+ end
+ end
+
+ # Delete a project snippet
+ #
+ # Parameters:
+ # id (required) - The code of a project
+ # snippet_id (required) - The ID of a project snippet
+ # Example Request:
+ # DELETE /projects/:id/snippets/:snippet_id
+ delete ":id/snippets/:snippet_id" do
+ @project = current_user.projects.find_by_code(params[:id])
+ @snippet = @project.snippets.find(params[:snippet_id])
+ @snippet.destroy
+ end
end
end
end
diff --git a/spec/api/projects_spec.rb b/spec/api/projects_spec.rb
index e4835736b8c..0fabb7a65b3 100644
--- a/spec/api/projects_spec.rb
+++ b/spec/api/projects_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe Gitlab::API do
let(:user) { Factory :user }
let!(:project) { Factory :project, :owner => user }
+ let!(:snippet) { Factory :snippet, :author => user, :project => project }
before { project.add_access(user, :read) }
describe "GET /projects" do
@@ -52,4 +53,31 @@ describe Gitlab::API do
json.first['name'].should == project.repo.tags.sort_by(&:name).reverse.first.name
end
end
+
+ describe "GET /projects/:id/snippets/:snippet_id" do
+ it "should return a project snippet" do
+ get "/api/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}"
+ response.status.should == 200
+ json = JSON.parse(response.body)
+ json['title'].should == snippet.title
+ end
+ end
+
+ describe "POST /projects/:id/snippets" do
+ it "should create a new project snippet" do
+ post "/api/projects/#{project.code}/snippets?private_token=#{user.private_token}",
+ :title => 'api test', :file_name => 'sample.rb', :code => 'test'
+ response.status.should == 201
+ json = JSON.parse(response.body)
+ json['title'].should == 'api test'
+ end
+ end
+
+ describe "DELETE /projects/:id/snippets/:snippet_id" do
+ it "should create a new project snippet" do
+ expect {
+ delete "/api/projects/#{project.code}/snippets/#{snippet.id}?private_token=#{user.private_token}"
+ }.should change { Snippet.count }.by(-1)
+ end
+ end
end