Commit 25b745271a1db25fc709ae13737b04c1f94cdb95
1 parent
49fe8fed
Exists in
master
and in
4 other branches
add API for project team members
Showing
4 changed files
with
139 additions
and
78 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
| @@ -24,9 +24,10 @@ module Gitlab | @@ -24,9 +24,10 @@ module Gitlab | ||
| 24 | expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at | 24 | expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at |
| 25 | end | 25 | end |
| 26 | 26 | ||
| 27 | - class UsersProject < Grape::Entity | ||
| 28 | - expose :user, using: Entities::UserBasic | ||
| 29 | - expose :project_access | 27 | + class ProjectMember < UserBasic |
| 28 | + expose :project_access, :as => :access_level do |user, options| | ||
| 29 | + options[:project].users_projects.find_by_user_id(user.id).project_access | ||
| 30 | + end | ||
| 30 | end | 31 | end |
| 31 | 32 | ||
| 32 | class RepoObject < Grape::Entity | 33 | class RepoObject < Grape::Entity |
lib/api/projects.rb
| @@ -40,14 +40,14 @@ module Gitlab | @@ -40,14 +40,14 @@ module Gitlab | ||
| 40 | post do | 40 | post do |
| 41 | params[:code] ||= params[:name] | 41 | params[:code] ||= params[:name] |
| 42 | params[:path] ||= params[:name] | 42 | params[:path] ||= params[:name] |
| 43 | - attrs = attributes_for_keys [:code, | ||
| 44 | - :path, | ||
| 45 | - :name, | ||
| 46 | - :description, | ||
| 47 | - :default_branch, | ||
| 48 | - :issues_enabled, | ||
| 49 | - :wall_enabled, | ||
| 50 | - :merge_requests_enabled, | 43 | + attrs = attributes_for_keys [:code, |
| 44 | + :path, | ||
| 45 | + :name, | ||
| 46 | + :description, | ||
| 47 | + :default_branch, | ||
| 48 | + :issues_enabled, | ||
| 49 | + :wall_enabled, | ||
| 50 | + :merge_requests_enabled, | ||
| 51 | :wiki_enabled] | 51 | :wiki_enabled] |
| 52 | @project = Project.create_by_user(attrs, current_user) | 52 | @project = Project.create_by_user(attrs, current_user) |
| 53 | if @project.saved? | 53 | if @project.saved? |
| @@ -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 |