Commit 131553627d2e62cea2ea8a342250ca2d2495d8fc
Exists in
master
and in
4 other branches
Merge pull request #1521 from NARKOZ/api
API for project team members
Showing
4 changed files
with
131 additions
and
70 deletions
Show diff stats
doc/api/projects.md
... | ... | @@ -112,66 +112,89 @@ Parameters: |
112 | 112 | Will return created project with status `201 Created` on success, or `404 Not |
113 | 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 | 123 | Parameters: |
124 | 124 | |
125 | 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 | 160 | Parameters: |
138 | 161 | |
139 | 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 | 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 | 176 | Parameters: |
154 | 177 | |
155 | 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 | 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 | 192 | Parameters: |
170 | 193 | |
171 | 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 | 199 | ## Get project hooks |
177 | 200 | |
... | ... | @@ -344,7 +367,7 @@ Parameters: |
344 | 367 | |
345 | 368 | + `id` (required) - The ID or code name of a project |
346 | 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 | 372 | Will return the raw file contents. |
350 | 373 | ... | ... |
lib/api/entities.rb
... | ... | @@ -29,9 +29,10 @@ module Gitlab |
29 | 29 | expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at |
30 | 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 | 36 | end |
36 | 37 | |
37 | 38 | class RepoObject < Grape::Entity | ... | ... |
lib/api/projects.rb
... | ... | @@ -57,56 +57,83 @@ module Gitlab |
57 | 57 | end |
58 | 58 | end |
59 | 59 | |
60 | - # Get project users | |
60 | + # Get a project team members | |
61 | 61 | # |
62 | 62 | # Parameters: |
63 | 63 | # id (required) - The ID or code name of a project |
64 | 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 | 69 | end |
70 | 70 | |
71 | - # Add users to project with specified access level | |
71 | + # Get a project team members | |
72 | 72 | # |
73 | 73 | # Parameters: |
74 | 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 | 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 | 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 | 104 | end |
84 | 105 | |
85 | - # Update users to specified access level | |
106 | + # Update project team member | |
86 | 107 | # |
87 | 108 | # Parameters: |
88 | 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 | 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 | 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 | 124 | end |
98 | 125 | |
99 | - # Delete project users | |
126 | + # Remove a team member from project | |
100 | 127 | # |
101 | 128 | # Parameters: |
102 | 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 | 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 | 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 | 137 | end |
111 | 138 | |
112 | 139 | # Get project hooks | ... | ... |
spec/requests/api/projects_spec.rb
... | ... | @@ -111,42 +111,52 @@ describe Gitlab::API do |
111 | 111 | end |
112 | 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 | 117 | response.status.should == 200 |
119 | - | |
120 | 118 | json_response.should be_an Array |
121 | 119 | json_response.count.should == 2 |
122 | - json_response.first['user']['id'].should == user.id | |
120 | + json_response.first['email'].should == user.email | |
123 | 121 | end |
124 | 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 | 130 | end |
133 | 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 | 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 | 152 | end |
142 | 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 | 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 | 160 | end |
151 | 161 | end |
152 | 162 | ... | ... |