Project deploy keys json end point
This commit is contained in:
parent
8f6608af65
commit
e0dc73527a
8 changed files with 144 additions and 2 deletions
|
@ -8,7 +8,12 @@ class Projects::DeployKeysController < Projects::ApplicationController
|
|||
layout "project_settings"
|
||||
|
||||
def index
|
||||
redirect_to_repository_settings(@project)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to_repository_settings(@project) }
|
||||
format.json do
|
||||
render json: Projects::Settings::DeployKeysPresenter.new(@project, current_user: current_user).as_json
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def new
|
||||
|
@ -19,7 +24,7 @@ class Projects::DeployKeysController < Projects::ApplicationController
|
|||
@key = DeployKey.new(deploy_key_params.merge(user: current_user))
|
||||
|
||||
unless @key.valid? && @project.deploy_keys << @key
|
||||
flash[:alert] = @key.errors.full_messages.join(', ').html_safe
|
||||
flash[:alert] = @key.errors.full_messages.join(', ').html_safe
|
||||
end
|
||||
redirect_to_repository_settings(@project)
|
||||
end
|
||||
|
|
|
@ -48,6 +48,17 @@ module Projects
|
|||
available_public_keys.any?
|
||||
end
|
||||
|
||||
def as_json
|
||||
serializer = DeployKeySerializer.new
|
||||
opts = { user: current_user }
|
||||
|
||||
{
|
||||
enabled_keys: serializer.represent(enabled_keys, opts),
|
||||
available_project_keys: serializer.represent(available_project_keys, opts),
|
||||
public_keys: serializer.represent(available_public_keys, opts)
|
||||
}
|
||||
end
|
||||
|
||||
def to_partial_path
|
||||
'projects/deploy_keys/index'
|
||||
end
|
||||
|
|
12
app/serializers/deploy_key_entity.rb
Normal file
12
app/serializers/deploy_key_entity.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
class DeployKeyEntity < Grape::Entity
|
||||
expose :id
|
||||
expose :user_id
|
||||
expose :title
|
||||
expose :fingerprint
|
||||
expose :can_push
|
||||
expose :created_at
|
||||
expose :updated_at
|
||||
expose :projects, using: ProjectEntity do |deploy_key|
|
||||
deploy_key.projects.select { |project| options[:user].can?(:read_project, project) }
|
||||
end
|
||||
end
|
3
app/serializers/deploy_key_serializer.rb
Normal file
3
app/serializers/deploy_key_serializer.rb
Normal file
|
@ -0,0 +1,3 @@
|
|||
class DeployKeySerializer < BaseSerializer
|
||||
entity DeployKeyEntity
|
||||
end
|
12
app/serializers/project_entity.rb
Normal file
12
app/serializers/project_entity.rb
Normal file
|
@ -0,0 +1,12 @@
|
|||
class ProjectEntity < Grape::Entity
|
||||
expose :id
|
||||
expose :name
|
||||
|
||||
expose :full_path do |project|
|
||||
project.full_path
|
||||
end
|
||||
|
||||
expose :full_name do |project|
|
||||
project.full_name
|
||||
end
|
||||
end
|
4
changelogs/unreleased/29667-deploy-keys.yml
Normal file
4
changelogs/unreleased/29667-deploy-keys.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Project deploy keys json end point
|
||||
merge_request:
|
||||
author:
|
66
spec/controllers/projects/deploy_keys_controller_spec.rb
Normal file
66
spec/controllers/projects/deploy_keys_controller_spec.rb
Normal file
|
@ -0,0 +1,66 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Projects::DeployKeysController do
|
||||
let(:project) { create(:project, :repository) }
|
||||
let(:user) { create(:user) }
|
||||
|
||||
before do
|
||||
project.team << [user, :master]
|
||||
|
||||
sign_in(user)
|
||||
end
|
||||
|
||||
describe 'GET index' do
|
||||
let(:params) do
|
||||
{ namespace_id: project.namespace, project_id: project }
|
||||
end
|
||||
|
||||
context 'when html requested' do
|
||||
it 'redirects to blob' do
|
||||
get :index, params
|
||||
|
||||
expect(response).to redirect_to(namespace_project_settings_repository_path(params))
|
||||
end
|
||||
end
|
||||
|
||||
context 'when json requested' do
|
||||
let(:project2) { create(:empty_project, :internal)}
|
||||
let(:project_private) { create(:empty_project, :private)}
|
||||
|
||||
let(:deploy_key_internal) do
|
||||
create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCdMHEHyhRjbhEZVddFn6lTWdgEy5Q6Bz4nwGB76xWZI5YT/1WJOMEW+sL5zYd31kk7sd3FJ5L9ft8zWMWrr/iWXQikC2cqZK24H1xy+ZUmrRuJD4qGAaIVoyyzBL+avL+lF8J5lg6YSw8gwJY/lX64/vnJHUlWw2n5BF8IFOWhiw== dummy@gitlab.com')
|
||||
end
|
||||
let(:deploy_key_actual) do
|
||||
create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNd/UJWhPrpb+b/G5oL109y57yKuCxE+WUGJGYaj7WQKsYRJmLYh1mgjrl+KVyfsWpq4ylOxIfFSnN9xBBFN8mlb0Fma5DC7YsSsibJr3MZ19ZNBprwNcdogET7aW9I0In7Wu5f2KqI6e5W/spJHCy4JVxzVMUvk6Myab0LnJ2iQ== dummy@gitlab.com')
|
||||
end
|
||||
let!(:deploy_key_public) { create(:deploy_key, public: true) }
|
||||
|
||||
let!(:deploy_keys_project_internal) do
|
||||
create(:deploy_keys_project, project: project2, deploy_key: deploy_key_internal)
|
||||
end
|
||||
|
||||
let!(:deploy_keys_actual_project) do
|
||||
create(:deploy_keys_project, project: project, deploy_key: deploy_key_actual)
|
||||
end
|
||||
|
||||
let!(:deploy_keys_project_private) do
|
||||
create(:deploy_keys_project, project: project_private, deploy_key: create(:another_deploy_key))
|
||||
end
|
||||
|
||||
before do
|
||||
project2.team << [user, :developer]
|
||||
end
|
||||
|
||||
it 'returns json in a correct format' do
|
||||
get :index, params.merge(format: :json)
|
||||
|
||||
json = JSON.parse(response.body)
|
||||
|
||||
expect(json.keys).to match_array(%w(enabled_keys available_project_keys public_keys))
|
||||
expect(json['enabled_keys'].count).to eq(1)
|
||||
expect(json['available_project_keys'].count).to eq(1)
|
||||
expect(json['public_keys'].count).to eq(1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
29
spec/serializers/deploy_key_entity_spec.rb
Normal file
29
spec/serializers/deploy_key_entity_spec.rb
Normal file
|
@ -0,0 +1,29 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe DeployKeyEntity do
|
||||
let(:user) { create(:user) }
|
||||
let(:project) { create(:empty_project, :internal)}
|
||||
let(:project_private) { create(:empty_project, :private)}
|
||||
let(:deploy_key) { create(:deploy_key) }
|
||||
let!(:deploy_key_internal) { create(:deploy_keys_project, project: project, deploy_key: deploy_key) }
|
||||
let!(:deploy_key_private) { create(:deploy_keys_project, project: project_private, deploy_key: deploy_key) }
|
||||
|
||||
let(:entity) { described_class.new(deploy_key, user: user) }
|
||||
|
||||
it 'returns deploy keys with projects a user can read' do
|
||||
expected_result = {
|
||||
id: deploy_key.id,
|
||||
user_id: deploy_key.user_id,
|
||||
title: deploy_key.title,
|
||||
fingerprint: deploy_key.fingerprint,
|
||||
can_push: deploy_key.can_push,
|
||||
created_at: deploy_key.created_at,
|
||||
updated_at: deploy_key.updated_at,
|
||||
projects: [
|
||||
{ id: project.id, name: project.name, full_path: project.full_path, full_name: project.full_name }
|
||||
]
|
||||
}
|
||||
|
||||
expect(entity.as_json).to eq(expected_result)
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue