diff options
author | jubianchi <contact@jubianchi.fr> | 2014-08-18 20:09:09 +0200 |
---|---|---|
committer | jubianchi <contact@jubianchi.fr> | 2014-09-16 01:25:24 +0200 |
commit | 998cd3cb63d56a0058c8e519d7c20e3d6e540899 (patch) | |
tree | 38b9319858451f8bbebc7670e5505a7f1e6665e1 /lib/api/users.rb | |
parent | 892371bc22813abe855f563bf4f0ee355fe067ab (diff) | |
download | gitlab-ce-998cd3cb63d56a0058c8e519d7c20e3d6e540899.tar.gz |
Improve error reporting on users API
* users (#6878, #3526, #4209): Validation error messages are now exposed through 400 responses, 409 response are sent in case of duplicate email or username
* MRs (#5335): 409 responses are sent in case of duplicate merge request (source/target branches), 422 responses are sent when submiting MR fo/from unrelated forks
* issues
* labels
* projects
Diffstat (limited to 'lib/api/users.rb')
-rw-r--r-- | lib/api/users.rb | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/lib/api/users.rb b/lib/api/users.rb index 69553f16397..d07815a8a97 100644 --- a/lib/api/users.rb +++ b/lib/api/users.rb @@ -42,7 +42,8 @@ module API # Parameters: # email (required) - Email # password (required) - Password - # name - Name + # name (required) - Name + # username (required) - Name # skype - Skype ID # linkedin - Linkedin # twitter - Twitter account @@ -65,7 +66,15 @@ module API if user.save present user, with: Entities::UserFull else - not_found! + conflict!('Email has already been taken') if User. + where(email: user.email). + count > 0 + + conflict!('Username has already been taken') if User. + where(username: user.username). + count > 0 + + render_validation_error!(user) end end @@ -92,14 +101,23 @@ module API attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :website_url, :projects_limit, :username, :extern_uid, :provider, :bio, :can_create_group, :admin] user = User.find(params[:id]) - not_found!("User not found") unless user + not_found!('User') unless user admin = attrs.delete(:admin) user.admin = admin unless admin.nil? + + conflict!('Email has already been taken') if attrs[:email] && + User.where(email: attrs[:email]). + where.not(id: user.id).count > 0 + + conflict!('Username has already been taken') if attrs[:username] && + User.where(username: attrs[:username]). + where.not(id: user.id).count > 0 + if user.update_attributes(attrs) present user, with: Entities::UserFull else - not_found! + render_validation_error!(user) end end @@ -113,13 +131,15 @@ module API # POST /users/:id/keys post ":id/keys" do authenticated_as_admin! + required_attributes! [:title, :key] + user = User.find(params[:id]) attrs = attributes_for_keys [:title, :key] key = user.keys.new attrs if key.save present key, with: Entities::SSHKey else - not_found! + render_validation_error!(key) end end @@ -132,11 +152,9 @@ module API get ':uid/keys' do authenticated_as_admin! user = User.find_by(id: params[:uid]) - if user - present user.keys, with: Entities::SSHKey - else - not_found! - end + not_found!('User') unless user + + present user.keys, with: Entities::SSHKey end # Delete existing ssh key of a specified user. Only available to admin @@ -150,15 +168,13 @@ module API delete ':uid/keys/:id' do authenticated_as_admin! user = User.find_by(id: params[:uid]) - if user - begin - key = user.keys.find params[:id] - key.destroy - rescue ActiveRecord::RecordNotFound - not_found! - end - else - not_found! + not_found!('User') unless user + + begin + key = user.keys.find params[:id] + key.destroy + rescue ActiveRecord::RecordNotFound + not_found!('Key') end end @@ -173,7 +189,7 @@ module API if user user.destroy else - not_found! + not_found!('User') end end end @@ -219,7 +235,7 @@ module API if key.save present key, with: Entities::SSHKey else - not_found! + render_validation_error!(key) end end |