Skip to content

Commit

Permalink
Implement GET /users/:uid/keys for admin users
Browse files Browse the repository at this point in the history
Complements POST operation added in #3146

Implement DELETE /users/:uid/keys/:id for admin users

Fix "Line is too long. [83/80]"

Use single quotes as advised

Use single quotes as advised

Use single quotes as advised

Fix missing space around { and }

Fix typo in documentation

Only catch  ActiveRecord::RecordNotFound, let other exceptions propagate

Raise a "404 Not found" if key to be deleted cannot be found
As requested by @jvanbaarsen in #6781 (comment)

Remove tab
Unconfigured vim on this box, grrrr./
  • Loading branch information
thekid committed Apr 18, 2014
1 parent cd62321 commit 05e792b
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 2 deletions.
4 changes: 2 additions & 2 deletions Gemfile.lock
Expand Up @@ -644,7 +644,7 @@ DEPENDENCIES
simplecov
sinatra
six
slack-notifier (~> 0.2.0)
slack-notifier (~> 0.3.2)
slim
spinach-rails
spring (= 1.1.1)
Expand All @@ -662,4 +662,4 @@ DEPENDENCIES
unicorn (~> 4.6.3)
unicorn-worker-killer
version_sorter
webmock
webmock
27 changes: 27 additions & 0 deletions doc/api/users.md
Expand Up @@ -220,6 +220,18 @@ Parameters:

+ **none**

## List SSH keys for user

Get a list of a specified user's SSH keys. Available only for admin

```
GET /users/:uid/keys
```

Parameters:

+ `uid` (required) - id of specified user


## Single SSH key

Expand Down Expand Up @@ -286,3 +298,18 @@ Parameters:

+ `id` (required) - SSH key ID

## Delete SSH key

Deletes key owned by a specified user. Available only for admin.

```
DELETE /users/:uid/keys/:id
```

Parameters:

+ `uid` (required) - id of specified user
+ `id` (required) - SSH key ID

Will return `200 Ok` on success, or `404 Not found` if either user or key cannot be found.

39 changes: 39 additions & 0 deletions lib/api/users.rb
Expand Up @@ -113,6 +113,45 @@ class Users < Grape::API
end
end

# Get ssh keys of a specified user. Only available to admin users.
#
# Parameters:
# uid (required) - The ID of a user
# Example Request:
# GET /users/:uid/keys
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
end

# Delete existing ssh key of a specified user. Only available to admin
# users.
#
# Parameters:
# uid (required) - The ID of a user
# id (required) - SSH Key ID
# Example Request:
# DELETE /users/:uid/keys/:id
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!
end
end

# Delete user. Available only for admin
#
# Example Request:
Expand Down
61 changes: 61 additions & 0 deletions spec/requests/api/users_spec.rb
Expand Up @@ -242,6 +242,67 @@
end
end

describe 'GET /user/:uid/keys' do
before { admin }

context 'when unauthenticated' do
it 'should return authentication error' do
get api("/users/#{user.id}/keys")
response.status.should == 401
end
end

context 'when authenticated' do
it 'should return 404 for non-existing user' do
get api('/users/999999/keys', admin)
response.status.should == 404
end

it 'should return array of ssh keys' do
user.keys << key
user.save
get api("/users/#{user.id}/keys", admin)
response.status.should == 200
json_response.should be_an Array
json_response.first['title'].should == key.title
end
end
end

describe 'DELETE /user/:uid/keys/:id' do
before { admin }

context 'when unauthenticated' do
it 'should return authentication error' do
delete api("/users/#{user.id}/keys/42")
response.status.should == 401
end
end

context 'when authenticated' do
it 'should delete existing key' do
user.keys << key
user.save
expect {
delete api("/users/#{user.id}/keys/#{key.id}", admin)
}.to change { user.keys.count }.by(-1)
response.status.should == 200
end

it 'should return 404 error if user not found' do
user.keys << key
user.save
delete api("/users/999999/keys/#{key.id}", admin)
response.status.should == 404
end

it 'should return 404 error if key not foud' do
delete api("/users/#{user.id}/keys/42", admin)
response.status.should == 404
end
end
end

describe "DELETE /users/:id" do
before { admin }

Expand Down

0 comments on commit 05e792b

Please sign in to comment.