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,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 |