summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-09-29 23:03:46 -0700
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-09-29 23:03:46 -0700
commit836104b41a557e8411d422c0dca7930e85b0de95 (patch)
tree5a45ebe5475209a098a6c8d818488ef35d18030e
parente48c6fab60d57b4af31f5b5d3e81ba09e4e68881 (diff)
parent5b657a65d4ec309be2cb7dfcacf85e98d59a4eb0 (diff)
downloadgitlab-ce-836104b41a557e8411d422c0dca7930e85b0de95.tar.gz
Merge pull request #5213 from bladealslayer/feature/user_api_extended
Extended User API to expose admin and can_create_group for user creation...
-rw-r--r--doc/api/users.md39
-rw-r--r--lib/api/entities.rb7
-rw-r--r--lib/api/helpers.rb2
-rw-r--r--lib/api/users.rb14
-rw-r--r--spec/requests/api/users_spec.rb47
5 files changed, 85 insertions, 24 deletions
diff --git a/doc/api/users.md b/doc/api/users.md
index 49afbab8c6a..50c0f560d87 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -23,7 +23,9 @@ GET /users
"extern_uid": "john.smith",
"provider": "provider_name",
"theme_id": 1,
- "color_scheme_id": 2
+ "color_scheme_id": 2,
+ "is_admin": false,
+ "can_create_group": true
},
{
"id": 2,
@@ -39,7 +41,9 @@ GET /users
"extern_uid": "jack.smith",
"provider": "provider_name",
"theme_id": 1,
- "color_scheme_id": 3
+ "color_scheme_id": 3,
+ "is_admin": false,
+ "can_create_group": true
}
]
```
@@ -72,7 +76,9 @@ Parameters:
"extern_uid": "john.smith",
"provider": "provider_name",
"theme_id": 1,
- "color_scheme_id": 2
+ "color_scheme_id": 2,
+ "is_admin": false,
+ "can_create_group": true
}
```
@@ -87,17 +93,19 @@ POST /users
Parameters:
-+ `email` (required) - Email
-+ `password` (required) - Password
-+ `username` (required) - Username
-+ `name` (required) - Name
-+ `skype` (optional) - Skype ID
-+ `linkedin` (optional) - Linkedin
-+ `twitter` (optional) - Twitter account
-+ `projects_limit` (optional) - Number of projects user can create
-+ `extern_uid` (optional) - External UID
-+ `provider` (optional) - External provider name
-+ `bio` (optional) - User's bio
++ `email` (required) - Email
++ `password` (required) - Password
++ `username` (required) - Username
++ `name` (required) - Name
++ `skype` (optional) - Skype ID
++ `linkedin` (optional) - Linkedin
++ `twitter` (optional) - Twitter account
++ `projects_limit` (optional) - Number of projects user can create
++ `extern_uid` (optional) - External UID
++ `provider` (optional) - External provider name
++ `bio` (optional) - User's bio
++ `admin` (optional) - User is admin - true or false (default)
++ `can_create_group` (optional) - User can create groups - true or false
## User modification
@@ -121,6 +129,8 @@ Parameters:
+ `extern_uid` - External UID
+ `provider` - External provider name
+ `bio` - User's bio
++ `admin` (optional) - User is admin - true or false (default)
++ `can_create_group` (optional) - User can create groups - true or false
Note, at the moment this method does only return a 404 error, even in cases where a 409 (Conflict) would
be more appropriate, e.g. when renaming the email address to some existing one.
@@ -166,7 +176,6 @@ GET /user
"color_scheme_id": 2,
"is_admin": false,
"can_create_group" : true,
- "can_create_team" : true,
"can_create_project" : true
}
```
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 1f35e9ec5fc..ab949f530ab 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -3,6 +3,9 @@ module API
class User < Grape::Entity
expose :id, :username, :email, :name, :bio, :skype, :linkedin, :twitter,
:theme_id, :color_scheme_id, :state, :created_at, :extern_uid, :provider
+ expose :is_admin?, as: :is_admin
+ expose :can_create_group?, as: :can_create_group
+ expose :can_create_project?, as: :can_create_project
end
class UserSafe < Grape::Entity
@@ -15,10 +18,6 @@ module API
class UserLogin < User
expose :private_token
- expose :is_admin?, as: :is_admin
- expose :can_create_group?, as: :can_create_group
- expose :can_create_project?, as: :can_create_project
- expose :can_create_team?, as: :can_create_team
end
class Hook < Grape::Entity
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index fdde6d5de6c..2b0c672c7fa 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -86,7 +86,7 @@ module API
def attributes_for_keys(keys)
attrs = {}
keys.each do |key|
- attrs[key] = params[key] if params[key].present?
+ attrs[key] = params[key] if params[key].present? or (params.has_key?(key) and params[key] == false)
end
attrs
end
diff --git a/lib/api/users.rb b/lib/api/users.rb
index 00dc2311ffd..54d3aeecb70 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -40,13 +40,17 @@ module API
# extern_uid - External authentication provider UID
# provider - External provider
# bio - Bio
+ # admin - User is admin - true or false (default)
+ # can_create_group - User can create groups - true or false
# Example Request:
# POST /users
post do
authenticated_as_admin!
required_attributes! [:email, :password, :name, :username]
- attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio]
+ attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio, :can_create_group, :admin]
user = User.build_user(attrs, as: :admin)
+ admin = attrs.delete(:admin)
+ user.admin = admin unless admin.nil?
if user.save
present user, with: Entities::User
else
@@ -67,16 +71,20 @@ module API
# extern_uid - External authentication provider UID
# provider - External provider
# bio - Bio
+ # admin - User is admin - true or false (default)
+ # can_create_group - User can create groups - true or false
# Example Request:
# PUT /users/:id
put ":id" do
authenticated_as_admin!
- attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio]
+ attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio, :can_create_group, :admin]
user = User.find(params[:id])
not_found!("User not found") unless user
- if user.update_attributes(attrs)
+ admin = attrs.delete(:admin)
+ user.admin = admin unless admin.nil?
+ if user.update_attributes(attrs, as: :admin)
present user, with: Entities::User
else
not_found!
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index 2fced3ec945..4ef78b8e5d0 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -52,6 +52,35 @@ describe API::API do
}.to change { User.count }.by(1)
end
+ it "should create user with correct attributes" do
+ post api('/users', admin), attributes_for(:user, admin: true, can_create_group: true)
+ response.status.should == 201
+ user_id = json_response['id']
+ new_user = User.find(user_id)
+ new_user.should_not == nil
+ new_user.admin.should == true
+ new_user.can_create_group.should == true
+ end
+
+ it "should create non-admin user" do
+ post api('/users', admin), attributes_for(:user, admin: false, can_create_group: false)
+ response.status.should == 201
+ user_id = json_response['id']
+ new_user = User.find(user_id)
+ new_user.should_not == nil
+ new_user.admin.should == false
+ new_user.can_create_group.should == false
+ end
+
+ it "should create non-admin users by default" do
+ post api('/users', admin), attributes_for(:user)
+ response.status.should == 201
+ user_id = json_response['id']
+ new_user = User.find(user_id)
+ new_user.should_not == nil
+ new_user.admin.should == false
+ end
+
it "should return 201 Created on success" do
post api("/users", admin), attributes_for(:user, projects_limit: 3)
response.status.should == 201
@@ -135,6 +164,8 @@ describe API::API do
end
describe "PUT /users/:id" do
+ let!(:admin_user) { create(:admin) }
+
before { admin }
it "should update user with new bio" do
@@ -144,6 +175,21 @@ describe API::API do
user.reload.bio.should == 'new test bio'
end
+ it "should update admin status" do
+ put api("/users/#{user.id}", admin), {admin: true}
+ response.status.should == 200
+ json_response['is_admin'].should == true
+ user.reload.admin.should == true
+ end
+
+ it "should not update admin status" do
+ put api("/users/#{admin_user.id}", admin), {can_create_group: false}
+ response.status.should == 200
+ json_response['is_admin'].should == true
+ admin_user.reload.admin.should == true
+ admin_user.can_create_group.should == false
+ end
+
it "should not allow invalid update" do
put api("/users/#{user.id}", admin), {email: 'invalid email'}
response.status.should == 404
@@ -228,7 +274,6 @@ describe API::API do
response.status.should == 200
json_response['email'].should == user.email
json_response['is_admin'].should == user.is_admin?
- json_response['can_create_team'].should == user.can_create_team?
json_response['can_create_project'].should == user.can_create_project?
json_response['can_create_group'].should == user.can_create_group?
end