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 | 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
| ... | ... | @@ -24,9 +24,10 @@ module Gitlab |
| 24 | 24 | expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at |
| 25 | 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 | 31 | end |
| 31 | 32 | |
| 32 | 33 | class RepoObject < Grape::Entity | ... | ... |
lib/api/projects.rb
| ... | ... | @@ -40,14 +40,14 @@ module Gitlab |
| 40 | 40 | post do |
| 41 | 41 | params[:code] ||= params[:name] |
| 42 | 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 | 51 | :wiki_enabled] |
| 52 | 52 | @project = Project.create_by_user(attrs, current_user) |
| 53 | 53 | if @project.saved? |
| ... | ... | @@ -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 | ... | ... |