From 378dc55d29a97447315c6181f678cf933afbbb78 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Fri, 29 Jun 2012 06:34:08 -0700 Subject: [PATCH] add project snippets API --- lib/api/entities.rb | 6 +++++ lib/api/projects.rb | 53 +++++++++++++++++++++++++++++++++++++++ spec/api/projects_spec.rb | 28 +++++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 44a43985..7129e761 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 670d3d97..815092f4 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 e4835736..0fabb7a6 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