diff --git a/lib/api.rb b/lib/api.rb index 4fdc3273a0e..6882615244b 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -1,61 +1,12 @@ -require 'api/entities' -require 'api/helpers' +Dir["#{Rails.root}/lib/api/*.rb"].each {|file| require file} module Gitlab class API < Grape::API format :json + error_format :json helpers APIHelpers - # Users API - resource :users do - before { authenticate! } - - # GET /users - get do - @users = User.all - present @users, :with => Entities::User - end - - # GET /users/:id - get ":id" do - @user = User.find(params[:id]) - present @user, :with => Entities::User - end - end - - # GET /user - get "/user" do - authenticate! - present @current_user, :with => Entities::User - end - - # Projects API - resource :projects do - before { authenticate! } - - # GET /projects - get do - @projects = current_user.projects - present @projects, :with => Entities::Project - end - - # GET /projects/:id - get ":id" do - @project = current_user.projects.find_by_code(params[:id]) - present @project, :with => Entities::Project - end - - # GET /projects/:id/repository/branches - get ":id/repository/branches" do - @project = current_user.projects.find_by_code(params[:id]) - present @project.repo.heads.sort_by(&:name), :with => Entities::ProjectRepositoryBranches - end - - # GET /projects/:id/repository/tags - get ":id/repository/tags" do - @project = current_user.projects.find_by_code(params[:id]) - present @project.repo.tags.sort_by(&:name).reverse, :with => Entities::ProjectRepositoryTags - end - end + mount Users + mount Projects end end 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/helpers.rb b/lib/api/helpers.rb index cd2e39bf3a7..424a17b283c 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -5,7 +5,7 @@ module Gitlab end def authenticate! - error!('401 Unauthorized', 401) unless current_user + error!({'message' => '401 Unauthorized'}, 401) unless current_user end end end diff --git a/lib/api/projects.rb b/lib/api/projects.rb new file mode 100644 index 00000000000..815092f4de5 --- /dev/null +++ b/lib/api/projects.rb @@ -0,0 +1,103 @@ +module Gitlab + # Projects API + class Projects < Grape::API + before { authenticate! } + + resource :projects do + # Get a projects list for authenticated user + # + # Example Request: + # GET /projects + get do + @projects = current_user.projects + present @projects, :with => Entities::Project + end + + # Get a single project + # + # Parameters: + # id (required) - The code of a project + # Example Request: + # GET /projects/:id + get ":id" do + @project = current_user.projects.find_by_code(params[:id]) + present @project, :with => Entities::Project + end + + # Get a project repository branches + # + # Parameters: + # id (required) - The code of a project + # Example Request: + # GET /projects/:id/repository/branches + get ":id/repository/branches" do + @project = current_user.projects.find_by_code(params[:id]) + present @project.repo.heads.sort_by(&:name), :with => Entities::ProjectRepositoryBranches + end + + # Get a project repository tags + # + # Parameters: + # id (required) - The code of a project + # Example Request: + # GET /projects/:id/repository/tags + get ":id/repository/tags" do + @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/lib/api/users.rb b/lib/api/users.rb new file mode 100644 index 00000000000..ef3762f30fc --- /dev/null +++ b/lib/api/users.rb @@ -0,0 +1,36 @@ +module Gitlab + # Users API + class Users < Grape::API + before { authenticate! } + + resource :users do + # Get a users list + # + # Example Request: + # GET /users + get do + @users = User.all + present @users, :with => Entities::User + end + + # Get a single user + # + # Parameters: + # id (required) - The ID of a user + # Example Request: + # GET /users/:id + get ":id" do + @user = User.find(params[:id]) + present @user, :with => Entities::User + end + end + + # Get currently authenticated user + # + # Example Request: + # GET /user + get "/user" do + present @current_user, :with => Entities::User + 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