From 8f7360f3901ae27a457f252b1a9a091a857434ee Mon Sep 17 00:00:00 2001 From: miks Date: Wed, 5 Sep 2012 23:01:03 +0300 Subject: API on adding users to project implemented --- doc/api/projects.md | 15 +++++++++++++++ lib/api/projects.rb | 12 ++++++++++++ spec/requests/api/projects_spec.rb | 12 ++++++++++++ 3 files changed, 39 insertions(+) diff --git a/doc/api/projects.md b/doc/api/projects.md index e029522be18..85b88d40fe8 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -106,6 +106,21 @@ Parameters: Will return created project with status `201 Created` on success, or `404 Not found` on fail. +## Add project users + +Add users to exiting project + +``` +PUT /projects/:id/add_users +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `user_ids` (required) - new project name ++ `project_access` (required) - new project name + +Will return updated project with status `200 OK` on success, or `404 Not found` on fail. ## Project repository branches diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 3d4fde9270f..46e688e47f0 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -44,6 +44,18 @@ module Gitlab end end + # Add users to project with specified access level + # + # Parameters: + # id (required) - The ID or code name of a project + # user_ids (required) - The ID list of users to add + # project_access (required) - Project access level + # Example Request: + # PUT /projects/:id/add_users + put ":id/add_users" do + user_project.add_users_ids_to_team(params[:user_ids], params[:project_access]) + end + # Get a project repository branches # # Parameters: diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index cc6843ccb66..f8434654317 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -62,6 +62,18 @@ describe Gitlab::API do end end + describe "PUT /projects/:id/add_users" do + @user2 = Factory :user + @user3 = Factory :user + + it "should add users to existing project" do + expect { + put api("/projects/#{project.code}/add_users", user), + user_ids: [@user2.id, @user3.id], project_access: UsersProject::DEVELOPER + }.to change {Project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) + end + end + describe "GET /projects/:id" do it "should return a project by id" do get api("/projects/#{project.id}", user) -- cgit v1.2.1 From e3b1f62c6b1fda0ea711f65c699d5025ab926c9d Mon Sep 17 00:00:00 2001 From: miks Date: Thu, 6 Sep 2012 00:13:25 +0300 Subject: convert params hash to array --- lib/api/projects.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 46e688e47f0..9cd86d0b899 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -53,7 +53,7 @@ module Gitlab # Example Request: # PUT /projects/:id/add_users put ":id/add_users" do - user_project.add_users_ids_to_team(params[:user_ids], params[:project_access]) + user_project.add_users_ids_to_team(params[:user_ids].values, params[:project_access]) end # Get a project repository branches -- cgit v1.2.1 From 94c50545661c21816faf1e143739f60b1058b8e1 Mon Sep 17 00:00:00 2001 From: miks Date: Thu, 6 Sep 2012 01:06:02 +0300 Subject: count against last project --- spec/requests/api/projects_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index f8434654317..1c723058910 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -70,7 +70,7 @@ describe Gitlab::API do expect { put api("/projects/#{project.code}/add_users", user), user_ids: [@user2.id, @user3.id], project_access: UsersProject::DEVELOPER - }.to change {Project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) + }.to change {Project.last.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) end end -- cgit v1.2.1 From cd846ba2b55cd1380febfa174d8cf82ad9e948f7 Mon Sep 17 00:00:00 2001 From: miks Date: Thu, 6 Sep 2012 09:52:27 +0300 Subject: Fix tests --- spec/requests/api/projects_spec.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 1c723058910..b1b5966c818 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -4,6 +4,8 @@ describe Gitlab::API do include ApiHelpers let(:user) { Factory :user } + let(:user2) { Factory.create(:user) } + let(:user3) { Factory.create(:user) } let!(:project) { Factory :project, owner: user } let!(:snippet) { Factory :snippet, author: user, project: project, title: 'example' } before { project.add_access(user, :read) } @@ -63,13 +65,10 @@ describe Gitlab::API do end describe "PUT /projects/:id/add_users" do - @user2 = Factory :user - @user3 = Factory :user - it "should add users to existing project" do expect { put api("/projects/#{project.code}/add_users", user), - user_ids: [@user2.id, @user3.id], project_access: UsersProject::DEVELOPER + user_ids: [user2.id, user3.id], project_access: UsersProject::DEVELOPER }.to change {Project.last.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) end end -- cgit v1.2.1 From ab057bb5dbf5806365d42371c968290235c555a8 Mon Sep 17 00:00:00 2001 From: miks Date: Thu, 6 Sep 2012 10:20:59 +0300 Subject: proper Grape params hash simulation --- spec/requests/api/projects_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index b1b5966c818..125101cad18 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -68,7 +68,7 @@ describe Gitlab::API do it "should add users to existing project" do expect { put api("/projects/#{project.code}/add_users", user), - user_ids: [user2.id, user3.id], project_access: UsersProject::DEVELOPER + user_ids: {"0" => user2.id, "1" => user3.id}, project_access: UsersProject::DEVELOPER }.to change {Project.last.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) end end -- cgit v1.2.1 From 3d3c6674fbea1b9099e80e1fc1768f85ecd3bf14 Mon Sep 17 00:00:00 2001 From: miks Date: Thu, 6 Sep 2012 16:32:26 +0300 Subject: Typo fixed --- doc/api/projects.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/projects.md b/doc/api/projects.md index 85b88d40fe8..972ea67ed3c 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -117,8 +117,8 @@ PUT /projects/:id/add_users Parameters: + `id` (required) - The ID or code name of a project -+ `user_ids` (required) - new project name -+ `project_access` (required) - new project name ++ `user_ids` (required) - The ID list of users to add ++ `project_access` (required) - Project access level Will return updated project with status `200 OK` on success, or `404 Not found` on fail. -- cgit v1.2.1 From 2dc0519277417456372d6bde5c47bec895cc497e Mon Sep 17 00:00:00 2001 From: miks Date: Thu, 6 Sep 2012 23:14:42 +0300 Subject: bulk access roles update/deletion added --- app/models/users_project.rb | 17 +++++++++++++++++ app/roles/team.rb | 13 +++++++++++++ 2 files changed, 30 insertions(+) diff --git a/app/models/users_project.rb b/app/models/users_project.rb index 7d1729343bb..654b371154c 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -20,6 +20,23 @@ class UsersProject < ActiveRecord::Base delegate :name, :email, to: :user, prefix: true + def self.bulk_delete(project, user_ids) + UsersProject.transaction do + UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project| + users_project.delete + end + end + end + + def self.bulk_update(project, user_ids, project_access) + UsersProject.transaction do + UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project| + users_project.project_access = project_access + users_project.save + end + end + end + def self.bulk_import(project, user_ids, project_access) UsersProject.transaction do user_ids.each do |user_id| diff --git a/app/roles/team.rb b/app/roles/team.rb index 27b1cc65897..d8798c507e3 100644 --- a/app/roles/team.rb +++ b/app/roles/team.rb @@ -36,4 +36,17 @@ module Team UsersProject.bulk_import(self, users_ids, access_role) self.update_repository end + + # Update multiple project users + # to same access role by user ids + def update_users_ids_to_role(users_ids, access_role) + UsersProject.bulk_update(self, users_ids, access_role) + self.update_repository + end + + # Delete multiple users from project by user ids + def delete_users_by_ids(users_ids) + UsersProject.bulk_delete(self, users_ids) + self.update_repository + end end -- cgit v1.2.1 From 909c8c345dff0851e15d81917efe7817c7f89e22 Mon Sep 17 00:00:00 2001 From: miks Date: Thu, 6 Sep 2012 23:49:29 +0300 Subject: Make project users API more RESTful --- doc/api/projects.md | 49 ++++++++++++++++++++++++++++++++++++-- lib/api/entities.rb | 5 ++++ lib/api/projects.rb | 38 +++++++++++++++++++++++++++-- spec/requests/api/projects_spec.rb | 27 +++++++++++++++++---- 4 files changed, 111 insertions(+), 8 deletions(-) diff --git a/doc/api/projects.md b/doc/api/projects.md index 972ea67ed3c..b26305b140f 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -106,12 +106,26 @@ Parameters: Will return created project with status `201 Created` on success, or `404 Not found` on fail. +## Get project users + +Get users and access roles for existing project + +``` +GET /projects/:id/users +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project + +Will return users and their access roles with status `200 OK` on success, or `404 Not found` on fail. + ## Add project users Add users to exiting project ``` -PUT /projects/:id/add_users +POST /projects/:id/users ``` Parameters: @@ -120,7 +134,38 @@ Parameters: + `user_ids` (required) - The ID list of users to add + `project_access` (required) - Project access level -Will return updated project with status `200 OK` on success, or `404 Not found` on fail. +Will return status `201 Created` on success, or `404 Not found` on fail. + +## Update project users access level + +Update existing users to specified access level + +``` +PUT /projects/:id/users +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `user_ids` (required) - The ID list of users to add ++ `project_access` (required) - Project access level + +Will return status `200 OK` on success, or `404 Not found` on fail. + +## Delete project users + +Delete users from exiting project + +``` +DELETE /projects/:id/users +``` + +Parameters: + ++ `id` (required) - The ID or code name of a project ++ `user_ids` (required) - The ID list of users to add + +Will return status `200 OK` on success, or `404 Not found` on fail. ## Project repository branches diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 96ccd87a407..fef5328d093 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -16,6 +16,11 @@ module Gitlab expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at end + class UsersProject < Grape::Entity + expose :user, using: Entities::UserBasic + expose :project_access + end + class RepoObject < Grape::Entity expose :name, :commit end diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 9cd86d0b899..e56f894987c 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -44,6 +44,17 @@ module Gitlab end end + # Get project users + # + # Parameters: + # id (required) - The ID or code name of a project + # Example Request: + # GET /projects/:id/users + get ":id/users" do + @users_projects = paginate user_project.users_projects + present @users_projects, with: Entities::UsersProject + end + # Add users to project with specified access level # # Parameters: @@ -51,11 +62,34 @@ module Gitlab # user_ids (required) - The ID list of users to add # project_access (required) - Project access level # Example Request: - # PUT /projects/:id/add_users - put ":id/add_users" do + # POST /projects/:id/users + post ":id/users" do user_project.add_users_ids_to_team(params[:user_ids].values, params[:project_access]) end + # Update users to specified access level + # + # Parameters: + # id (required) - The ID or code name of a project + # user_ids (required) - The ID list of users to add + # project_access (required) - New project access level to + # Example Request: + # PUT /projects/:id/add_users + put ":id/users" do + user_project.update_users_ids_to_role(params[:user_ids].values, params[:project_access]) + end + + # Delete project users + # + # Parameters: + # id (required) - The ID or code name of a project + # user_ids (required) - The ID list of users to delete + # Example Request: + # DELETE /projects/:id/users + delete ":id/users" do + user_project.delete_users_ids_from_team(params[:user_ids].values) + end + # Get a project repository branches # # Parameters: diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 125101cad18..73ec37603c1 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -8,6 +8,7 @@ describe Gitlab::API do let(:user3) { Factory.create(:user) } 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 } before { project.add_access(user, :read) } describe "GET /projects" do @@ -64,12 +65,30 @@ describe Gitlab::API do end end - describe "PUT /projects/:id/add_users" do - it "should add users to existing project" do + describe "POST /projects/:id/users" do + it "should add users to project" do expect { - put api("/projects/#{project.code}/add_users", user), + post api("/projects/#{project.code}/users", user), user_ids: {"0" => user2.id, "1" => user3.id}, project_access: UsersProject::DEVELOPER - }.to change {Project.last.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) + }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) + end + end + + describe "PUT /projects/:id/users" do + it "should update users to new access role" do + expect { + put api("/projects/#{project.code}/users", user), + user_ids: {"0" => user}, project_access: UsersProject::DEVELOPER + }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(1) + end + end + + describe "DELETE /projects/:id/users" do + it "should delete users from project" do + expect { + delete api("/projects/#{project.code}/delete", user), + user_ids: {"0" => users_project.id} + }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(-1) end end -- cgit v1.2.1 From 2e76342d72fac88e98820f038dce8fa01952fefb Mon Sep 17 00:00:00 2001 From: miks Date: Sat, 8 Sep 2012 12:37:23 +0300 Subject: typo fixed --- app/roles/team.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/roles/team.rb b/app/roles/team.rb index d8798c507e3..8aef405aaf3 100644 --- a/app/roles/team.rb +++ b/app/roles/team.rb @@ -45,7 +45,7 @@ module Team end # Delete multiple users from project by user ids - def delete_users_by_ids(users_ids) + def delete_users_ids_from_team(users_ids) UsersProject.bulk_delete(self, users_ids) self.update_repository end -- cgit v1.2.1 From 8a3408180ab51effd516de3c8e85d564aa4dfabd Mon Sep 17 00:00:00 2001 From: miks Date: Sat, 8 Sep 2012 17:40:36 +0300 Subject: move "users" test after project tests --- spec/requests/api/projects_spec.rb | 54 +++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 8c294594693..71ed39e7cbf 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -67,33 +67,6 @@ describe Gitlab::API do end end - describe "POST /projects/:id/users" do - it "should add users to project" do - expect { - post api("/projects/#{project.code}/users", user), - user_ids: {"0" => user2.id, "1" => user3.id}, project_access: UsersProject::DEVELOPER - }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) - end - end - - describe "PUT /projects/:id/users" do - it "should update users to new access role" do - expect { - put api("/projects/#{project.code}/users", user), - user_ids: {"0" => user}, project_access: UsersProject::DEVELOPER - }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(1) - end - end - - describe "DELETE /projects/:id/users" do - it "should delete users from project" do - expect { - delete api("/projects/#{project.code}/delete", user), - user_ids: {"0" => users_project.id} - }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(-1) - end - end - describe "GET /projects/:id" do it "should return a project by id" do get api("/projects/#{project.id}", user) @@ -134,6 +107,33 @@ describe Gitlab::API do end end + describe "POST /projects/:id/users" do + it "should add users to project" do + expect { + post api("/projects/#{project.code}/users", user), + user_ids: {"0" => user2.id, "1" => user3.id}, project_access: UsersProject::DEVELOPER + }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) + end + end + + describe "PUT /projects/:id/users" do + it "should update users to new access role" do + expect { + put api("/projects/#{project.code}/users", user), + user_ids: {"0" => user}, project_access: UsersProject::DEVELOPER + }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(1) + end + end + + describe "DELETE /projects/:id/users" do + it "should delete users from project" do + expect { + delete api("/projects/#{project.code}/users", user), + user_ids: {"0" => users_project.id} + }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).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) -- cgit v1.2.1 From 0d1009af85c1ed6936a568e9bab9e4da28e69a30 Mon Sep 17 00:00:00 2001 From: miks Date: Sat, 8 Sep 2012 17:51:28 +0300 Subject: "users" GET test added --- spec/requests/api/projects_spec.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 71ed39e7cbf..e224982a721 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -107,6 +107,18 @@ describe Gitlab::API do end end + describe "GET /projects/:id/users" do + it "should return project users" do + get api("/projects/#{project.code}/users", user) + + response.status.should == 200 + + json_response.should be_an Array + json_response.count.should == 1 + json_response.first['user']['id'].should == user.id + end + end + describe "POST /projects/:id/users" do it "should add users to project" do expect { -- cgit v1.2.1 From 499ff8b441b517902a0daf79600a59cc1830730e Mon Sep 17 00:00:00 2001 From: miks Date: Sat, 8 Sep 2012 19:39:10 +0300 Subject: fix failing tests --- spec/requests/api/projects_spec.rb | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index e224982a721..439aeccecec 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -8,7 +8,8 @@ describe Gitlab::API do let(:user3) { Factory.create(:user) } 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 } + let!(:users_project) { Factory :users_project, user: user, project: project, project_access: UsersProject::MASTER } + let!(:users_project2) { Factory :users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER } before { project.add_access(user, :read) } describe "GET /projects" do @@ -114,7 +115,7 @@ describe Gitlab::API do response.status.should == 200 json_response.should be_an Array - json_response.count.should == 1 + json_response.count.should == 2 json_response.first['user']['id'].should == user.id end end @@ -123,8 +124,8 @@ describe Gitlab::API do it "should add users to project" do expect { post api("/projects/#{project.code}/users", user), - user_ids: {"0" => user2.id, "1" => user3.id}, project_access: UsersProject::DEVELOPER - }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(2) + user_ids: {"0" => user2.id}, project_access: UsersProject::DEVELOPER + }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(1) end end @@ -132,8 +133,8 @@ describe Gitlab::API do it "should update users to new access role" do expect { put api("/projects/#{project.code}/users", user), - user_ids: {"0" => user}, project_access: UsersProject::DEVELOPER - }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(1) + user_ids: {"0" => user3.id}, project_access: UsersProject::MASTER + }.to change {project.users_projects.where(:project_access => UsersProject::MASTER).count}.by(1) end end @@ -141,8 +142,8 @@ describe Gitlab::API do it "should delete users from project" do expect { delete api("/projects/#{project.code}/users", user), - user_ids: {"0" => users_project.id} - }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(-1) + user_ids: {"0" => user3.id} + }.to change {project.users_projects.count}.by(-1) end end -- cgit v1.2.1 From 27e443650746ddb7bf63d9a34d4afaa15350521d Mon Sep 17 00:00:00 2001 From: miks Date: Sat, 8 Sep 2012 20:01:08 +0300 Subject: Return empty body --- lib/api/projects.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 6e445b2aac7..7da83429dd4 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -75,6 +75,7 @@ module Gitlab # POST /projects/:id/users post ":id/users" do user_project.add_users_ids_to_team(params[:user_ids].values, params[:project_access]) + nil end # Update users to specified access level @@ -87,6 +88,7 @@ module Gitlab # PUT /projects/:id/add_users put ":id/users" do user_project.update_users_ids_to_role(params[:user_ids].values, params[:project_access]) + nil end # Delete project users @@ -98,6 +100,7 @@ module Gitlab # DELETE /projects/:id/users delete ":id/users" do user_project.delete_users_ids_from_team(params[:user_ids].values) + nil end # Get a project repository branches -- cgit v1.2.1 From 3b5a90bdf654f9715fd15c189d59bd56492bae8c Mon Sep 17 00:00:00 2001 From: miks Date: Sat, 8 Sep 2012 20:51:12 +0300 Subject: 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 72874e59682..73d6adc9bc3 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 fef5328d093..b50d683f940 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 7da83429dd4..876de321c9c 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 439aeccecec..23fb34e6e21 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) -- cgit v1.2.1 From 6d76e000d07300ab9e8e8c74b90db0abcdc48451 Mon Sep 17 00:00:00 2001 From: miks Date: Mon, 10 Sep 2012 16:50:01 +0300 Subject: Add authorization to hooks requests --- lib/api/projects.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/api/projects.rb b/lib/api/projects.rb index dfdd359c2b2..cf23dc5f538 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -113,6 +113,7 @@ module Gitlab # Example Request: # GET /projects/:id/hooks get ":id/hooks" do + authorize! :admin_project, user_project @hooks = paginate user_project.hooks present @hooks, with: Entities::Hook end @@ -125,6 +126,7 @@ module Gitlab # Example Request: # POST /projects/:id/hooks post ":id/hooks" do + authorize! :admin_project, user_project @hook = user_project.hooks.new({"url" => params[:url]}) if @hook.save present @hook, with: Entities::Hook @@ -141,6 +143,7 @@ module Gitlab # Example Request: # DELETE /projects/:id/hooks delete ":id/hooks" do + authorize! :admin_project, user_project @hook = user_project.hooks.find(params[:hook_id]) @hook.destroy nil -- cgit v1.2.1