summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Denisov <1101.debian@gmail.com>2012-09-16 17:52:06 +0300
committerAlex Denisov <1101.debian@gmail.com>2012-09-16 17:52:06 +0300
commitc23eb4082948322a1b690e0850c09bfc8df81589 (patch)
treeb8fa0b5cff6e69176aec2b5398f508f81733f5d4
parentcaef9ed1121a16ca0cc78715695daaa974271bfd (diff)
downloadgitlab-ce-c23eb4082948322a1b690e0850c09bfc8df81589.tar.gz
SSH Keys API implemented
-rw-r--r--lib/api.rb1
-rw-r--r--lib/api/entities.rb6
-rw-r--r--lib/api/keys.rb44
-rw-r--r--spec/requests/api/ssh_keys_spec.rb55
4 files changed, 106 insertions, 0 deletions
diff --git a/lib/api.rb b/lib/api.rb
index be04701c25d..37e03849b96 100644
--- a/lib/api.rb
+++ b/lib/api.rb
@@ -17,5 +17,6 @@ module Gitlab
mount Projects
mount Issues
mount Milestones
+ mount Keys
end
end
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index b50d683f940..13a48e12019 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -48,5 +48,11 @@ module Gitlab
expose :assignee, :author, using: Entities::UserBasic
expose :closed, :updated_at, :created_at
end
+
+ class Key < Grape::Entity
+ expose :id,
+ :title,
+ :key
+ end
end
end
diff --git a/lib/api/keys.rb b/lib/api/keys.rb
new file mode 100644
index 00000000000..96ab7029fe5
--- /dev/null
+++ b/lib/api/keys.rb
@@ -0,0 +1,44 @@
+module Gitlab
+ # Keys API
+ class Keys < Grape::API
+ before { authenticate! }
+ resource :keys do
+ # Get currently authenticated user's keys
+ #
+ # Example Request:
+ # GET /keys
+ get do
+ present current_user.keys, with: Entities::Key
+ end
+ # Add new ssh key to currently authenticated user
+ #
+ # Parameters:
+ # key (required) - New SSH Key
+ # title (required) - New SSH Key's title
+ # Example Request:
+ # POST /keys
+ post do
+ key = current_user.keys.new(
+ title: params[:title],
+ key: params[:key]
+ )
+ if key.save
+ present key, with: Entities::Key
+ else
+ not_found!
+ end
+ end
+ # Delete existed ssh key of currently authenticated user
+ #
+ # Parameters:
+ # id (required) - SSH Key ID
+ # Example Request:
+ # DELETE /keys/:id
+ delete "/:id" do
+ key = current_user.keys.find params[:id]
+ key.delete
+ end
+ end
+ end
+end
+
diff --git a/spec/requests/api/ssh_keys_spec.rb b/spec/requests/api/ssh_keys_spec.rb
new file mode 100644
index 00000000000..b8c60377897
--- /dev/null
+++ b/spec/requests/api/ssh_keys_spec.rb
@@ -0,0 +1,55 @@
+require 'spec_helper'
+
+describe Gitlab::Keys do
+ include ApiHelpers
+ let(:user) {
+ user = Factory.create :user
+ user.reset_authentication_token!
+ user
+ }
+ let(:key) { Factory.create :key, { user: user}}
+
+ describe "GET /keys" do
+ context "when unauthenticated" do
+ it "should return authentication error" do
+ get api("/keys")
+ response.status.should == 401
+ end
+ end
+ context "when authenticated" do
+ it "should return array of ssh keys" do
+ user.keys << key
+ user.save
+ get api("/keys", user)
+ response.status.should == 200
+ json_response.should be_an Array
+ json_response.first["title"].should == key.title
+ end
+ end
+ end
+
+ describe "POST /keys" do
+ it "should not create invalid ssh key" do
+ post api("/keys", user), { title: "invalid key" }
+ response.status.should == 404
+ end
+ it "should create ssh key" do
+ key_attrs = Factory.attributes :key
+ expect {
+ post api("/keys", user), key_attrs
+ }.to change{ user.keys.count }.by(1)
+ end
+ end
+
+ describe "DELETE /keys/:id" do
+ it "should delete existed key" do
+ user.keys << key
+ user.save
+ expect {
+ delete api("/keys/#{key.id}", user)
+ }.to change{user.keys.count}.by(-1)
+ end
+ end
+
+end
+