Commit 131553627d2e62cea2ea8a342250ca2d2495d8fc

Authored by Dmitriy Zaporozhets
2 parents 10d3a30b 25b74527

Merge pull request #1521 from NARKOZ/api

API for project team members
doc/api/projects.md
@@ -112,66 +112,89 @@ Parameters: @@ -112,66 +112,89 @@ Parameters:
112 Will return created project with status `201 Created` on success, or `404 Not 112 Will return created project with status `201 Created` on success, or `404 Not
113 found` on fail. 113 found` on fail.
114 114
115 -## Get project users 115 +## List project team members
116 116
117 -Get users and access roles for existing project 117 +Get a list of project team members.
118 118
119 ``` 119 ```
120 -GET /projects/:id/users 120 +GET /projects/:id/members
121 ``` 121 ```
122 122
123 Parameters: 123 Parameters:
124 124
125 + `id` (required) - The ID or code name of a project 125 + `id` (required) - The ID or code name of a project
126 126
127 -Will return users and their access roles with status `200 OK` on success, or `404 Not found` on fail. 127 +## Get project team member
128 128
129 -## Add project users 129 +Get a project team member.
130 130
131 -Add users to exiting project 131 +```
  132 +GET /projects/:id/members/:user_id
  133 +```
  134 +
  135 +Parameters:
132 136
  137 ++ `id` (required) - The ID or code name of a project
  138 ++ `user_id` (required) - The ID of a user
  139 +
  140 +```json
  141 +{
  142 +
  143 + "id": 1,
  144 + "email": "john@example.com",
  145 + "name": "John Smith",
  146 + "blocked": false,
  147 + "created_at": "2012-05-23T08:00:58Z",
  148 + "access_level": 40
  149 +}
133 ``` 150 ```
134 -POST /projects/:id/users 151 +
  152 +## Add project team member
  153 +
  154 +Add a user to a project team.
  155 +
  156 +```
  157 +POST /projects/:id/members
135 ``` 158 ```
136 159
137 Parameters: 160 Parameters:
138 161
139 + `id` (required) - The ID or code name of a project 162 + `id` (required) - The ID or code name of a project
140 -+ `user_ids` (required) - The ID list of users to add  
141 -+ `project_access` (required) - Project access level 163 ++ `user_id` (required) - The ID of a user to add
  164 ++ `access_level` (required) - Project access level
142 165
143 Will return status `201 Created` on success, or `404 Not found` on fail. 166 Will return status `201 Created` on success, or `404 Not found` on fail.
144 167
145 -## Update project users access level 168 +## Edit project team member
146 169
147 -Update existing users to specified access level 170 +Update project team member to specified access level.
148 171
149 ``` 172 ```
150 -PUT /projects/:id/users 173 +PUT /projects/:id/members/:user_id
151 ``` 174 ```
152 175
153 Parameters: 176 Parameters:
154 177
155 + `id` (required) - The ID or code name of a project 178 + `id` (required) - The ID or code name of a project
156 -+ `user_ids` (required) - The ID list of users to add  
157 -+ `project_access` (required) - Project access level 179 ++ `user_id` (required) - The ID of a team member
  180 ++ `access_level` (required) - Project access level
158 181
159 Will return status `200 OK` on success, or `404 Not found` on fail. 182 Will return status `200 OK` on success, or `404 Not found` on fail.
160 183
161 -## Delete project users 184 +## Remove project team member
162 185
163 -Delete users from exiting project 186 +Removes user from project team.
164 187
165 ``` 188 ```
166 -DELETE /projects/:id/users 189 +DELETE /projects/:id/members/:user_id
167 ``` 190 ```
168 191
169 Parameters: 192 Parameters:
170 193
171 + `id` (required) - The ID or code name of a project 194 + `id` (required) - The ID or code name of a project
172 -+ `user_ids` (required) - The ID list of users to add 195 ++ `user_id` (required) - The ID of a team member
173 196
174 -Will return status `200 OK` on success, or `404 Not found` on fail. 197 +Status code `200` will be returned on success.
175 198
176 ## Get project hooks 199 ## Get project hooks
177 200
@@ -344,7 +367,7 @@ Parameters: @@ -344,7 +367,7 @@ Parameters:
344 367
345 + `id` (required) - The ID or code name of a project 368 + `id` (required) - The ID or code name of a project
346 + `sha` (required) - The commit or branch name 369 + `sha` (required) - The commit or branch name
347 -+ `filepath` (required) - The path the file 370 ++ `filepath` (required) - The path the file
348 371
349 Will return the raw file contents. 372 Will return the raw file contents.
350 373
lib/api/entities.rb
@@ -29,9 +29,10 @@ module Gitlab @@ -29,9 +29,10 @@ module Gitlab
29 expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at 29 expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at
30 end 30 end
31 31
32 - class UsersProject < Grape::Entity  
33 - expose :user, using: Entities::UserBasic  
34 - expose :project_access 32 + class ProjectMember < UserBasic
  33 + expose :project_access, :as => :access_level do |user, options|
  34 + options[:project].users_projects.find_by_user_id(user.id).project_access
  35 + end
35 end 36 end
36 37
37 class RepoObject < Grape::Entity 38 class RepoObject < Grape::Entity
lib/api/projects.rb
@@ -57,56 +57,83 @@ module Gitlab @@ -57,56 +57,83 @@ module Gitlab
57 end 57 end
58 end 58 end
59 59
60 - # Get project users 60 + # Get a project team members
61 # 61 #
62 # Parameters: 62 # Parameters:
63 # id (required) - The ID or code name of a project 63 # id (required) - The ID or code name of a project
64 # Example Request: 64 # Example Request:
65 - # GET /projects/:id/users  
66 - get ":id/users" do  
67 - @users_projects = paginate user_project.users_projects  
68 - present @users_projects, with: Entities::UsersProject 65 + # GET /projects/:id/members
  66 + get ":id/members" do
  67 + @members = paginate user_project.users
  68 + present @members, with: Entities::ProjectMember, project: user_project
69 end 69 end
70 70
71 - # Add users to project with specified access level 71 + # Get a project team members
72 # 72 #
73 # Parameters: 73 # Parameters:
74 # id (required) - The ID or code name of a project 74 # id (required) - The ID or code name of a project
75 - # user_ids (required) - The ID list of users to add  
76 - # project_access (required) - Project access level 75 + # user_id (required) - The ID of a user
77 # Example Request: 76 # Example Request:
78 - # POST /projects/:id/users  
79 - post ":id/users" do 77 + # GET /projects/:id/members/:user_id
  78 + get ":id/members/:user_id" do
  79 + @member = user_project.users.find params[:user_id]
  80 + present @member, with: Entities::ProjectMember, project: user_project
  81 + end
  82 +
  83 + # Add a new project team member
  84 + #
  85 + # Parameters:
  86 + # id (required) - The ID or code name of a project
  87 + # user_id (required) - The ID of a user
  88 + # access_level (required) - Project access level
  89 + # Example Request:
  90 + # POST /projects/:id/members
  91 + post ":id/members" do
80 authorize! :admin_project, user_project 92 authorize! :admin_project, user_project
81 - user_project.add_users_ids_to_team(params[:user_ids].values, params[:project_access])  
82 - nil 93 + users_project = user_project.users_projects.new(
  94 + user_id: params[:user_id],
  95 + project_access: params[:access_level]
  96 + )
  97 +
  98 + if users_project.save
  99 + @member = users_project.user
  100 + present @member, with: Entities::ProjectMember, project: user_project
  101 + else
  102 + not_found!
  103 + end
83 end 104 end
84 105
85 - # Update users to specified access level 106 + # Update project team member
86 # 107 #
87 # Parameters: 108 # Parameters:
88 # id (required) - The ID or code name of a project 109 # id (required) - The ID or code name of a project
89 - # user_ids (required) - The ID list of users to add  
90 - # project_access (required) - New project access level to 110 + # user_id (required) - The ID of a team member
  111 + # access_level (required) - Project access level
91 # Example Request: 112 # Example Request:
92 - # PUT /projects/:id/add_users  
93 - put ":id/users" do 113 + # PUT /projects/:id/members/:user_id
  114 + put ":id/members/:user_id" do
94 authorize! :admin_project, user_project 115 authorize! :admin_project, user_project
95 - user_project.update_users_ids_to_role(params[:user_ids].values, params[:project_access])  
96 - nil 116 + users_project = user_project.users_projects.find_by_user_id params[:user_id]
  117 +
  118 + if users_project.update_attributes(project_access: params[:access_level])
  119 + @member = users_project.user
  120 + present @member, with: Entities::ProjectMember, project: user_project
  121 + else
  122 + not_found!
  123 + end
97 end 124 end
98 125
99 - # Delete project users 126 + # Remove a team member from project
100 # 127 #
101 # Parameters: 128 # Parameters:
102 # id (required) - The ID or code name of a project 129 # id (required) - The ID or code name of a project
103 - # user_ids (required) - The ID list of users to delete 130 + # user_id (required) - The ID of a team member
104 # Example Request: 131 # Example Request:
105 - # DELETE /projects/:id/users  
106 - delete ":id/users" do 132 + # DELETE /projects/:id/members/:user_id
  133 + delete ":id/members/:user_id" do
107 authorize! :admin_project, user_project 134 authorize! :admin_project, user_project
108 - user_project.delete_users_ids_from_team(params[:user_ids].values)  
109 - nil 135 + users_project = user_project.users_projects.find_by_user_id params[:user_id]
  136 + users_project.destroy
110 end 137 end
111 138
112 # Get project hooks 139 # Get project hooks
spec/requests/api/projects_spec.rb
@@ -111,42 +111,52 @@ describe Gitlab::API do @@ -111,42 +111,52 @@ describe Gitlab::API do
111 end 111 end
112 end 112 end
113 113
114 - describe "GET /projects/:id/users" do  
115 - it "should return project users" do  
116 - get api("/projects/#{project.code}/users", user)  
117 - 114 + describe "GET /projects/:id/members" do
  115 + it "should return project team members" do
  116 + get api("/projects/#{project.code}/members", user)
118 response.status.should == 200 117 response.status.should == 200
119 -  
120 json_response.should be_an Array 118 json_response.should be_an Array
121 json_response.count.should == 2 119 json_response.count.should == 2
122 - json_response.first['user']['id'].should == user.id 120 + json_response.first['email'].should == user.email
123 end 121 end
124 end 122 end
125 123
126 - describe "POST /projects/:id/users" do  
127 - it "should add users to project" do  
128 - expect {  
129 - post api("/projects/#{project.code}/users", user),  
130 - user_ids: {"0" => user2.id}, project_access: UsersProject::DEVELOPER  
131 - }.to change {project.users_projects.where(:project_access => UsersProject::DEVELOPER).count}.by(1) 124 + describe "GET /projects/:id/members/:user_id" do
  125 + it "should return project team member" do
  126 + get api("/projects/#{project.code}/members/#{user.id}", user)
  127 + response.status.should == 200
  128 + json_response['email'].should == user.email
  129 + json_response['access_level'].should == UsersProject::MASTER
132 end 130 end
133 end 131 end
134 132
135 - describe "PUT /projects/:id/users" do  
136 - it "should update users to new access role" do 133 + describe "POST /projects/:id/members" do
  134 + it "should add user to project team" do
137 expect { 135 expect {
138 - put api("/projects/#{project.code}/users", user),  
139 - user_ids: {"0" => user3.id}, project_access: UsersProject::MASTER  
140 - }.to change {project.users_projects.where(:project_access => UsersProject::MASTER).count}.by(1) 136 + post api("/projects/#{project.code}/members", user), user_id: user2.id,
  137 + access_level: UsersProject::DEVELOPER
  138 + }.to change { UsersProject.count }.by(1)
  139 +
  140 + response.status.should == 201
  141 + json_response['email'].should == user2.email
  142 + json_response['access_level'].should == UsersProject::DEVELOPER
  143 + end
  144 + end
  145 +
  146 + describe "PUT /projects/:id/members/:user_id" do
  147 + it "should update project team member" do
  148 + put api("/projects/#{project.code}/members/#{user3.id}", user), access_level: UsersProject::MASTER
  149 + response.status.should == 200
  150 + json_response['email'].should == user3.email
  151 + json_response['access_level'].should == UsersProject::MASTER
141 end 152 end
142 end 153 end
143 154
144 - describe "DELETE /projects/:id/users" do  
145 - it "should delete users from project" do 155 + describe "DELETE /projects/:id/members/:user_id" do
  156 + it "should remove user from project team" do
146 expect { 157 expect {
147 - delete api("/projects/#{project.code}/users", user),  
148 - user_ids: {"0" => user3.id}  
149 - }.to change {project.users_projects.count}.by(-1) 158 + delete api("/projects/#{project.code}/members/#{user3.id}", user)
  159 + }.to change { UsersProject.count }.by(-1)
150 end 160 end
151 end 161 end
152 162