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