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"
|
layout "project_settings"
|
||||||
|
|
||||||
def index
|
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
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@ -19,7 +24,7 @@ class Projects::DeployKeysController < Projects::ApplicationController
|
||||||
@key = DeployKey.new(deploy_key_params.merge(user: current_user))
|
@key = DeployKey.new(deploy_key_params.merge(user: current_user))
|
||||||
|
|
||||||
unless @key.valid? && @project.deploy_keys << @key
|
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
|
end
|
||||||
redirect_to_repository_settings(@project)
|
redirect_to_repository_settings(@project)
|
||||||
end
|
end
|
||||||
|
|
|
@ -48,6 +48,17 @@ module Projects
|
||||||
available_public_keys.any?
|
available_public_keys.any?
|
||||||
end
|
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
|
def to_partial_path
|
||||||
'projects/deploy_keys/index'
|
'projects/deploy_keys/index'
|
||||||
end
|
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