summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-09-21 04:19:16 -0700
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-09-21 04:19:16 -0700
commit131553627d2e62cea2ea8a342250ca2d2495d8fc (patch)
tree0011e2fb22baf6d410837cdcafdc23cac872ccec
parent10d3a30b255cd85b2cf7af39814fd7418eecd838 (diff)
parent25b745271a1db25fc709ae13737b04c1f94cdb95 (diff)
downloadgitlab-ce-131553627d2e62cea2ea8a342250ca2d2495d8fc.tar.gz
Merge pull request #1521 from NARKOZ/api
API for project team members
-rw-r--r--doc/api/projects.md63
-rw-r--r--lib/api/entities.rb7
-rw-r--r--lib/api/projects.rb77
-rw-r--r--spec/requests/api/projects_spec.rb54
4 files changed, 131 insertions, 70 deletions
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 53ee5d412ab..1e23df3ac89 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -112,66 +112,89 @@ Parameters:
Will return created project with status `201 Created` on success, or `404 Not
found` on fail.
-## Get project users
+## List project team members
-Get users and access roles for existing project
+Get a list of project team members.
```
-GET /projects/:id/users
+GET /projects/:id/members
```
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.
+## Get project team member
-## Add project users
+Get a project team member.
-Add users to exiting project
+```
+GET /projects/:id/members/:user_id
+```
+
+Parameters:
++ `id` (required) - The ID or code name of a project
++ `user_id` (required) - The ID of a user
+
+```json
+{
+
+ "id": 1,
+ "email": "john@example.com",
+ "name": "John Smith",
+ "blocked": false,
+ "created_at": "2012-05-23T08:00:58Z",
+ "access_level": 40
+}
```
-POST /projects/:id/users
+
+## Add project team member
+
+Add a user to a project team.
+
+```
+POST /projects/:id/members
```
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
++ `user_id` (required) - The ID of a user to add
++ `access_level` (required) - Project access level
Will return status `201 Created` on success, or `404 Not found` on fail.
-## Update project users access level
+## Edit project team member
-Update existing users to specified access level
+Update project team member to specified access level.
```
-PUT /projects/:id/users
+PUT /projects/:id/members/:user_id
```
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
++ `user_id` (required) - The ID of a team member
++ `access_level` (required) - Project access level
Will return status `200 OK` on success, or `404 Not found` on fail.
-## Delete project users
+## Remove project team member
-Delete users from exiting project
+Removes user from project team.
```
-DELETE /projects/:id/users
+DELETE /projects/:id/members/:user_id
```
Parameters:
+ `id` (required) - The ID or code name of a project
-+ `user_ids` (required) - The ID list of users to add
++ `user_id` (required) - The ID of a team member
-Will return status `200 OK` on success, or `404 Not found` on fail.
+Status code `200` will be returned on success.
## Get project hooks
@@ -344,7 +367,7 @@ Parameters:
+ `id` (required) - The ID or code name of a project
+ `sha` (required) - The commit or branch name
-+ `filepath` (required) - The path the file
++ `filepath` (required) - The path the file
Will return the raw file contents.
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 1909a016208..fd19fa0e87f 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -29,9 +29,10 @@ 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
+ class ProjectMember < UserBasic
+ expose :project_access, :as => :access_level do |user, options|
+ options[:project].users_projects.find_by_user_id(user.id).project_access
+ end
end
class RepoObject < Grape::Entity
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index d6ff02c3cd2..0554d97c86b 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -57,56 +57,83 @@ module Gitlab
end
end
- # Get project users
+ # Get a project team members
#
# 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
+ # GET /projects/:id/members
+ get ":id/members" do
+ @members = paginate user_project.users
+ present @members, with: Entities::ProjectMember, project: user_project
end
- # Add users to project with specified access level
+ # Get a project team members
#
# 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
+ # user_id (required) - The ID of a user
# Example Request:
- # POST /projects/:id/users
- post ":id/users" do
+ # GET /projects/:id/members/:user_id
+ get ":id/members/:user_id" do
+ @member = user_project.users.find params[:user_id]
+ present @member, with: Entities::ProjectMember, project: user_project
+ end
+
+ # Add a new project team member
+ #
+ # Parameters:
+ # id (required) - The ID or code name of a project
+ # user_id (required) - The ID of a user
+ # access_level (required) - Project access level
+ # Example Request:
+ # POST /projects/:id/members
+ post ":id/members" do
authorize! :admin_project, user_project
- user_project.add_users_ids_to_team(params[:user_ids].values, params[:project_access])
- nil
+ users_project = user_project.users_projects.new(
+ user_id: params[:user_id],
+ project_access: params[:access_level]
+ )
+
+ if users_project.save
+ @member = users_project.user
+ present @member, with: Entities::ProjectMember, project: user_project
+ else
+ not_found!
+ end
end
- # Update users to specified access level
+ # Update project team member
#
# 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
+ # user_id (required) - The ID of a team member
+ # access_level (required) - Project access level
# Example Request:
- # PUT /projects/:id/add_users
- put ":id/users" do
+ # PUT /projects/:id/members/:user_id
+ put ":id/members/:user_id" do
authorize! :admin_project, user_project
- user_project.update_users_ids_to_role(params[:user_ids].values, params[:project_access])
- nil
+ users_project = user_project.users_projects.find_by_user_id params[:user_id]
+
+ if users_project.update_attributes(project_access: params[:access_level])
+ @member = users_project.user
+ present @member, with: Entities::ProjectMember, project: user_project
+ else
+ not_found!
+ end
end
- # Delete project users
+ # Remove a team member from project
#
# Parameters:
# id (required) - The ID or code name of a project
- # user_ids (required) - The ID list of users to delete
+ # user_id (required) - The ID of a team member
# Example Request:
- # DELETE /projects/:id/users
- delete ":id/users" do
+ # DELETE /projects/:id/members/:user_id
+ delete ":id/members/:user_id" do
authorize! :admin_project, user_project
- user_project.delete_users_ids_from_team(params[:user_ids].values)
- nil
+ users_project = user_project.users_projects.find_by_user_id params[:user_id]
+ users_project.destroy
end
# Get project hooks
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index b46380b21d9..40a9147d726 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -111,42 +111,52 @@ 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)
-
+ describe "GET /projects/:id/members" do
+ it "should return project team members" do
+ get api("/projects/#{project.code}/members", user)
response.status.should == 200
-
json_response.should be_an Array
json_response.count.should == 2
- json_response.first['user']['id'].should == user.id
+ json_response.first['email'].should == user.email
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}, project_access: UsersProject::DEVELOPER
- }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(1)
+ describe "GET /projects/:id/members/:user_id" do
+ it "should return project team member" do
+ get api("/projects/#{project.code}/members/#{user.id}", user)
+ response.status.should == 200
+ json_response['email'].should == user.email
+ json_response['access_level'].should == UsersProject::MASTER
end
end
- describe "PUT /projects/:id/users" do
- it "should update users to new access role" do
+ describe "POST /projects/:id/members" do
+ it "should add user to project team" do
expect {
- put api("/projects/#{project.code}/users", user),
- user_ids: {"0" => user3.id}, project_access: UsersProject::MASTER
- }.to change {project.users_projects.where(:project_access => UsersProject::MASTER).count}.by(1)
+ post api("/projects/#{project.code}/members", user), user_id: user2.id,
+ access_level: UsersProject::DEVELOPER
+ }.to change { UsersProject.count }.by(1)
+
+ response.status.should == 201
+ json_response['email'].should == user2.email
+ json_response['access_level'].should == UsersProject::DEVELOPER
+ end
+ end
+
+ describe "PUT /projects/:id/members/:user_id" do
+ it "should update project team member" do
+ put api("/projects/#{project.code}/members/#{user3.id}", user), access_level: UsersProject::MASTER
+ response.status.should == 200
+ json_response['email'].should == user3.email
+ json_response['access_level'].should == UsersProject::MASTER
end
end
- describe "DELETE /projects/:id/users" do
- it "should delete users from project" do
+ describe "DELETE /projects/:id/members/:user_id" do
+ it "should remove user from project team" do
expect {
- delete api("/projects/#{project.code}/users", user),
- user_ids: {"0" => user3.id}
- }.to change {project.users_projects.count}.by(-1)
+ delete api("/projects/#{project.code}/members/#{user3.id}", user)
+ }.to change { UsersProject.count }.by(-1)
end
end