OSDN Git Service

Projects hooks API implemented
authormiks <miks@cubesystems.lv>
Sat, 8 Sep 2012 17:51:12 +0000 (20:51 +0300)
committermiks <miks@cubesystems.lv>
Sat, 8 Sep 2012 17:51:12 +0000 (20:51 +0300)
doc/api/projects.md
lib/api/entities.rb
lib/api/projects.rb
spec/requests/api/projects_spec.rb

index 72874e5..73d6adc 100644 (file)
@@ -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.
index fef5328..b50d683 100644 (file)
@@ -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
index 7da8342..876de32 100644 (file)
@@ -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:
index 439aecc..23fb34e 100644 (file)
@@ -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)