summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiks <miks@cubesystems.lv>2012-09-06 23:49:29 +0300
committermiks <miks@cubesystems.lv>2012-09-06 23:49:29 +0300
commit909c8c345dff0851e15d81917efe7817c7f89e22 (patch)
tree4956244a32cce076eb0aa5d1f614bdf7c042faa0
parent2dc0519277417456372d6bde5c47bec895cc497e (diff)
downloadgitlab-ce-909c8c345dff0851e15d81917efe7817c7f89e22.tar.gz
Make project users API more RESTful
-rw-r--r--doc/api/projects.md49
-rw-r--r--lib/api/entities.rb5
-rw-r--r--lib/api/projects.rb38
-rw-r--r--spec/requests/api/projects_spec.rb27
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