diff options
author | Nihad Abbasov <narkoz.2008@gmail.com> | 2012-09-21 04:49:28 -0700 |
---|---|---|
committer | Nihad Abbasov <narkoz.2008@gmail.com> | 2012-09-21 04:49:28 -0700 |
commit | b62445813dffec92e85540ed081e4d6e12d58dc0 (patch) | |
tree | 6417cd7e74ded09612892d963c1423c9c82a8de2 | |
parent | 4a072be2d775d5ce59573cfb447ddab940854d54 (diff) | |
download | gitlab-ce-b62445813dffec92e85540ed081e4d6e12d58dc0.tar.gz |
API: SSH keys belong to user entity
-rw-r--r-- | doc/api/keys.md | 79 | ||||
-rw-r--r-- | doc/api/users.md | 78 | ||||
-rw-r--r-- | lib/api.rb | 1 | ||||
-rw-r--r-- | lib/api/entities.rb | 4 | ||||
-rw-r--r-- | lib/api/keys.rb | 50 | ||||
-rw-r--r-- | lib/api/users.rb | 59 | ||||
-rw-r--r-- | spec/requests/api/ssh_keys_spec.rb | 73 | ||||
-rw-r--r-- | spec/requests/api/users_spec.rb | 63 |
8 files changed, 195 insertions, 212 deletions
diff --git a/doc/api/keys.md b/doc/api/keys.md deleted file mode 100644 index d22b22e20b8..00000000000 --- a/doc/api/keys.md +++ /dev/null @@ -1,79 +0,0 @@ -## List keys - -Get a list of currently authenticated user's keys. - -``` -GET /keys -``` - -```json -[ - { - "id": 1, - "title" : "Public key" - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 - 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 - soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - }, - { - "id": 3, - "title" : "Another Public key" - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 - 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 - soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" - } -] -``` - -## Single key - -Get a single key. - -``` -GET /keys/:id -``` - -Parameters: - -+ `id` (required) - The ID of a key - -```json -{ - "id": 1, - "title" : "Public key" - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 - 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 - soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" -} -``` -## Add key - -Create new key owned by currently authenticated user - -``` -POST /keys -``` - -Parameters: - -+ `title` (required) - new SSH Key's title -+ `key` (required) - new SSH key - -Will return created key with status `201 Created` on success, or `404 Not -found` on fail. - -## Delete key - -Delete key owned by currently authenticated user - -``` -DELETE /keys/:id -``` - -Parameters: - -+ `id` (required) - key ID - -Will return `200 OK` on success, or `404 Not Found` on fail. - - diff --git a/doc/api/users.md b/doc/api/users.md index b9b04dc5399..4f806b145d1 100644 --- a/doc/api/users.md +++ b/doc/api/users.md @@ -88,3 +88,81 @@ GET /user "theme_id": 1 } ``` + +## List SSH keys + +Get a list of currently authenticated user's SSH keys. + +``` +GET /user/keys +``` + +```json +[ + { + "id": 1, + "title" : "Public key" + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", + }, + { + "id": 3, + "title" : "Another Public key" + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" + } +] +``` + +## Single SSH key + +Get a single key. + +``` +GET /user/keys/:id +``` + +Parameters: + ++ `id` (required) - The ID of an SSH key + +```json +{ + "id": 1, + "title" : "Public key" + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" +} +``` +## Add SSH key + +Create new key owned by currently authenticated user + +``` +POST /user/keys +``` + +Parameters: + ++ `title` (required) - new SSH Key's title ++ `key` (required) - new SSH key + +Will return created key with status `201 Created` on success, or `404 Not +found` on fail. + +## Delete SSH key + +Delete key owned by currently authenticated user + +``` +DELETE /user/keys/:id +``` + +Parameters: + ++ `id` (required) - SSH key ID + +Will return `200 OK` on success, or `404 Not Found` on fail. diff --git a/lib/api.rb b/lib/api.rb index 3b62f31bf32..2890a8cc9e8 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -17,7 +17,6 @@ module Gitlab mount Projects mount Issues mount Milestones - mount Keys mount Session end end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index ee6f15f1218..ee693de699e 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -60,8 +60,8 @@ module Gitlab expose :closed, :updated_at, :created_at end - class Key < Grape::Entity - expose :id, :title, :key + class SSHKey < Grape::Entity + expose :id, :title, :key end end end diff --git a/lib/api/keys.rb b/lib/api/keys.rb deleted file mode 100644 index 4c302727c4f..00000000000 --- a/lib/api/keys.rb +++ /dev/null @@ -1,50 +0,0 @@ -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 - # Get single key owned by currently authenticated user - # - # Example Request: - # GET /keys/:id - get "/:id" do - key = current_user.keys.find params[:id] - present key, 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 - attrs = attributes_for_keys [:title, :key] - key = current_user.keys.new attrs - 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/lib/api/users.rb b/lib/api/users.rb index 98ced6f8e5b..0ca8fb2a1ae 100644 --- a/lib/api/users.rb +++ b/lib/api/users.rb @@ -25,12 +25,59 @@ module Gitlab end end - # Get currently authenticated user - # - # Example Request: - # GET /user - get "/user" do - present @current_user, with: Entities::User + resource :user do + # Get currently authenticated user + # + # Example Request: + # GET /user + get do + present @current_user, with: Entities::User + end + + # Get currently authenticated user's keys + # + # Example Request: + # GET /user/keys + get "keys" do + present current_user.keys, with: Entities::SSHKey + end + + # Get single key owned by currently authenticated user + # + # Example Request: + # GET /user/keys/:id + get "keys/:id" do + key = current_user.keys.find params[:id] + present key, with: Entities::SSHKey + 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 /user/keys + post "keys" do + attrs = attributes_for_keys [:title, :key] + key = current_user.keys.new attrs + if key.save + present key, with: Entities::SSHKey + else + not_found! + end + end + + # Delete existed ssh key of currently authenticated user + # + # Parameters: + # id (required) - SSH Key ID + # Example Request: + # DELETE /user/keys/:id + delete "keys/: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 deleted file mode 100644 index 7fb8c920fb1..00000000000 --- a/spec/requests/api/ssh_keys_spec.rb +++ /dev/null @@ -1,73 +0,0 @@ -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 "GET /keys/:id" do - it "should returm single key" do - user.keys << key - user.save - get api("/keys/#{key.id}", user) - response.status.should == 200 - json_response["title"].should == key.title - end - it "should return 404 Not Found within invalid ID" do - get api("/keys/42", user) - response.status.should == 404 - 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 - it "should return 404 Not Found within invalid ID" do - delete api("/keys/42", user) - response.status.should == 404 - end - end - -end - diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb index e25fe1341d5..5d7ef99c481 100644 --- a/spec/requests/api/users_spec.rb +++ b/spec/requests/api/users_spec.rb @@ -3,7 +3,8 @@ require 'spec_helper' describe Gitlab::API do include ApiHelpers - let(:user) { Factory :user } + let(:user) { Factory :user } + let(:key) { Factory :key, user: user } describe "GET /users" do context "when unauthenticated" do @@ -38,4 +39,64 @@ describe Gitlab::API do json_response['email'].should == user.email end end + + describe "GET /user/keys" do + context "when unauthenticated" do + it "should return authentication error" do + get api("/user/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("/user/keys", user) + response.status.should == 200 + json_response.should be_an Array + json_response.first["title"].should == key.title + end + end + end + + describe "GET /user/keys/:id" do + it "should returm single key" do + user.keys << key + user.save + get api("/user/keys/#{key.id}", user) + response.status.should == 200 + json_response["title"].should == key.title + end + it "should return 404 Not Found within invalid ID" do + get api("/user/keys/42", user) + response.status.should == 404 + end + end + + describe "POST /user/keys" do + it "should not create invalid ssh key" do + post api("/user/keys", user), { title: "invalid key" } + response.status.should == 404 + end + it "should create ssh key" do + key_attrs = Factory.attributes :key + expect { + post api("/user/keys", user), key_attrs + }.to change{ user.keys.count }.by(1) + end + end + + describe "DELETE /user/keys/:id" do + it "should delete existed key" do + user.keys << key + user.save + expect { + delete api("/user/keys/#{key.id}", user) + }.to change{user.keys.count}.by(-1) + end + it "should return 404 Not Found within invalid ID" do + delete api("/user/keys/42", user) + response.status.should == 404 + end + end end |