From 3b5a90bdf654f9715fd15c189d59bd56492bae8c Mon Sep 17 00:00:00 2001 From: miks Date: Sat, 8 Sep 2012 20:51:12 +0300 Subject: [PATCH] Projects hooks API implemented --- doc/api/projects.md | 44 ++++++++++++++++++++++++++++++++++++++ lib/api/entities.rb | 4 ++++ lib/api/projects.rb | 40 ++++++++++++++++++++++++++++++++++ spec/requests/api/projects_spec.rb | 31 +++++++++++++++++++++++++++ 4 files changed, 119 insertions(+) diff --git a/doc/api/projects.md b/doc/api/projects.md index 72874e596..73d6adc9b 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -173,6 +173,50 @@ Parameters: Will return status `200 OK` on success, or `404 Not found` on fail. +## Get project hooks + +Get hooks for project + +``` +GET /projects/:id/hooks +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project + +Will return hooks with status `200 OK` on success, or `404 Not found` on fail. + +## Add project hook + +Add hook to project + +``` +POST /projects/:id/hooks +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `url` (required) - The hook URL + +Will return status `201 Created` on success, or `404 Not found` on fail. + +## Delete project hook + +Delete hook from project + +``` +DELETE /projects/:id/hooks +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `hook_id` (required) - The ID of hook to delete + +Will return status `200 OK` on success, or `404 Not found` on fail. + ## Project repository branches Get a list of repository branches from a project, sorted by name alphabetically. diff --git a/lib/api/entities.rb b/lib/api/entities.rb index fef5328d0..b50d683f9 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -9,6 +9,10 @@ module Gitlab expose :id, :email, :name, :blocked, :created_at end + class Hook < Grape::Entity + expose :id, :url + end + class Project < Grape::Entity expose :id, :code, :name, :description, :path, :default_branch expose :owner, using: Entities::UserBasic diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 7da83429d..876de321c 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -103,6 +103,46 @@ module Gitlab nil end + # Get project hooks + # + # Parameters: + # id (required) - The ID or code name of a project + # Example Request: + # GET /projects/:id/hooks + get ":id/hooks" do + @hooks = paginate user_project.hooks + present @hooks, with: Entities::Hook + end + + # Add hook to project + # + # Parameters: + # id (required) - The ID or code name of a project + # url (required) - The hook URL + # Example Request: + # POST /projects/:id/hooks + post ":id/hooks" do + @hook = user_project.hooks.new({"url" => params[:url]}) + if @hook.save + present @hook, with: Entities::Hook + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Delete project hook + # + # Parameters: + # id (required) - The ID or code name of a project + # hook_id (required) - The ID of hook to delete + # Example Request: + # DELETE /projects/:id/hooks + delete ":id/hooks" do + @hook = user_project.hooks.find(params[:hook_id]) + @hook.destroy + nil + end + # Get a project repository branches # # Parameters: diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 439aeccec..23fb34e6e 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -6,6 +6,7 @@ describe Gitlab::API do let(:user) { Factory :user } let(:user2) { Factory.create(:user) } let(:user3) { Factory.create(:user) } + let!(:hook) { Factory :project_hook, project: project, url: "http://example.com" } let!(:project) { Factory :project, owner: user } let!(:snippet) { Factory :snippet, author: user, project: project, title: 'example' } let!(:users_project) { Factory :users_project, user: user, project: project, project_access: UsersProject::MASTER } @@ -147,6 +148,36 @@ describe Gitlab::API do end end + describe "GET /projects/:id/hooks" do + it "should return project hooks" do + get api("/projects/#{project.code}/hooks", user) + + response.status.should == 200 + + json_response.should be_an Array + json_response.count.should == 1 + json_response.first['url'].should == "http://example.com" + end + end + + describe "POST /projects/:id/users" do + it "should add hook to project" do + expect { + post api("/projects/#{project.code}/hooks", user), + "url" => "http://example.com" + }.to change {project.hooks.count}.by(1) + end + end + + describe "DELETE /projects/:id/hooks" do + it "should delete hook from project" do + expect { + delete api("/projects/#{project.code}/hooks", user), + hook_id: hook.id + }.to change {project.hooks.count}.by(-1) + end + end + describe "GET /projects/:id/repository/tags" do it "should return an array of project tags" do get api("/projects/#{project.code}/repository/tags", user) -- 2.11.0