diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb index f84d2ed320d26d33e412fbf039671c6c74c9cba3..32d1ddf920e8199310d04eb0c496bed6950bfef4 100644 --- a/app/controllers/autocomplete_controller.rb +++ b/app/controllers/autocomplete_controller.rb @@ -62,7 +62,9 @@ def merge_request_target_branches def deploy_keys_with_owners deploy_keys = DeployKey.with_write_access_for_project(project) - render json: DeployKeySerializer.new.represent(deploy_keys, { with_owner: true, user: current_user }) + render json: DeployKeys::BasicDeployKeySerializer.new.represent( + deploy_keys, { with_owner: true, user: current_user } + ) end private diff --git a/app/presenters/projects/settings/deploy_keys_presenter.rb b/app/presenters/projects/settings/deploy_keys_presenter.rb index e3323b7518811b5f5256f250017964d41f04208f..b760786aa4ce71af45541ded27945fe4791b4072 100644 --- a/app/presenters/projects/settings/deploy_keys_presenter.rb +++ b/app/presenters/projects/settings/deploy_keys_presenter.rb @@ -58,7 +58,7 @@ def available_public_keys end def as_json - serializer = DeployKeySerializer.new # rubocop: disable CodeReuse/Serializer + serializer = DeployKeys::DeployKeySerializer.new # rubocop: disable CodeReuse/Serializer opts = { user: current_user, project: project, readable_project_ids: readable_project_ids } { diff --git a/app/serializers/deploy_key_entity.rb b/app/serializers/deploy_key_entity.rb deleted file mode 100644 index 486189b84cab285920d7004733884158a6719d20..0000000000000000000000000000000000000000 --- a/app/serializers/deploy_key_entity.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -class DeployKeyEntity < Grape::Entity - expose :id - expose :user_id - expose :title - expose :fingerprint - expose :fingerprint_sha256 - expose :destroyed_when_orphaned?, as: :destroyed_when_orphaned - expose :almost_orphaned?, as: :almost_orphaned - expose :created_at - expose :updated_at - expose :deploy_keys_projects, using: DeployKeysProjectEntity do |deploy_key| - deploy_key.deploy_keys_projects.select do |deploy_key_project| - !deploy_key_project.project&.pending_delete? && (allowed_to_read_project?(deploy_key_project.project) || options[:user].admin?) - end - end - expose :can_edit - expose :user, as: :owner, using: ::API::Entities::UserBasic, if: -> (_, opts) { can_read_owner?(opts) } - - private - - def can_edit - Ability.allowed?(options[:user], :update_deploy_key, object) || - Ability.allowed?(options[:user], :update_deploy_keys_project, object.deploy_keys_project_for(options[:project])) - end - - def can_read_owner?(opts) - opts[:with_owner] && Ability.allowed?(options[:user], :read_user, object.user) - end - - def allowed_to_read_project?(project) - if options[:readable_project_ids] - options[:readable_project_ids].include?(project.id) - else - Ability.allowed?(options[:user], :read_project, project) - end - end -end diff --git a/app/serializers/deploy_key_serializer.rb b/app/serializers/deploy_key_serializer.rb deleted file mode 100644 index a1cd98b631b4c6b2dcf4c09ccc6571dc9ea13884..0000000000000000000000000000000000000000 --- a/app/serializers/deploy_key_serializer.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -class DeployKeySerializer < BaseSerializer - entity DeployKeyEntity -end diff --git a/app/serializers/deploy_keys/basic_deploy_key_entity.rb b/app/serializers/deploy_keys/basic_deploy_key_entity.rb new file mode 100644 index 0000000000000000000000000000000000000000..9184bc5f0ceacf9e651037b15b2a219f9d0e0b7b --- /dev/null +++ b/app/serializers/deploy_keys/basic_deploy_key_entity.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module DeployKeys + class BasicDeployKeyEntity < Grape::Entity + expose :id + expose :user_id + expose :title + expose :fingerprint + expose :fingerprint_sha256 + expose :destroyed_when_orphaned?, as: :destroyed_when_orphaned + expose :almost_orphaned?, as: :almost_orphaned + expose :created_at + expose :updated_at + expose :can_edit + expose :user, as: :owner, using: ::API::Entities::UserBasic, if: -> (_, opts) { can_read_owner?(opts) } + + private + + def can_edit + Ability.allowed?(options[:user], :update_deploy_key, object) || + Ability.allowed?(options[:user], :update_deploy_keys_project, object.deploy_keys_project_for(options[:project])) + end + + def can_read_owner?(opts) + opts[:with_owner] && Ability.allowed?(options[:user], :read_user, object.user) + end + end +end diff --git a/app/serializers/deploy_keys/basic_deploy_key_serializer.rb b/app/serializers/deploy_keys/basic_deploy_key_serializer.rb new file mode 100644 index 0000000000000000000000000000000000000000..699f3baac7843f012c8660fefca2f98ac2b6d055 --- /dev/null +++ b/app/serializers/deploy_keys/basic_deploy_key_serializer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module DeployKeys + class BasicDeployKeySerializer < BaseSerializer + entity BasicDeployKeyEntity + end +end diff --git a/app/serializers/deploy_keys/deploy_key_entity.rb b/app/serializers/deploy_keys/deploy_key_entity.rb new file mode 100644 index 0000000000000000000000000000000000000000..79f386d1529cbc3e48e3cad89a6b8014bdbffc17 --- /dev/null +++ b/app/serializers/deploy_keys/deploy_key_entity.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module DeployKeys + class DeployKeyEntity < BasicDeployKeyEntity + expose :deploy_keys_projects, using: DeployKeysProjectEntity do |deploy_key| + deploy_key.deploy_keys_projects.select do |deploy_key_project| + !deploy_key_project.project&.pending_delete? && + (allowed_to_read_project?(deploy_key_project.project) || options[:user].can_admin_all_resources?) + end + end + + private + + def allowed_to_read_project?(project) + if options[:readable_project_ids] + options[:readable_project_ids].include?(project.id) + else + Ability.allowed?(options[:user], :read_project, project) + end + end + end +end diff --git a/app/serializers/deploy_keys/deploy_key_serializer.rb b/app/serializers/deploy_keys/deploy_key_serializer.rb new file mode 100644 index 0000000000000000000000000000000000000000..b00ef65696f95a65b162fd5c00edc710afecf164 --- /dev/null +++ b/app/serializers/deploy_keys/deploy_key_serializer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module DeployKeys + class DeployKeySerializer < BaseSerializer + entity DeployKeyEntity + end +end diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb index 0a809e80fcd936dd18ac86ccf1563eabdf58aae2..e874df62cd7d295b16496bf1744b31beb53f57c8 100644 --- a/spec/controllers/autocomplete_controller_spec.rb +++ b/spec/controllers/autocomplete_controller_spec.rb @@ -411,6 +411,7 @@ def request expect(json_response.count).to eq(1) expect(json_response.first['title']).to eq(deploy_key.title) expect(json_response.first['owner']['id']).to eq(deploy_key.user.id) + expect(json_response.first['deploy_keys_projects']).to be_nil end context 'with an unknown project' do @@ -433,6 +434,7 @@ def request expect(json_response.count).to eq(1) expect(json_response.first['title']).to eq(deploy_key.title) expect(json_response.first['owner']).to be_nil + expect(json_response.first['deploy_keys_projects']).to be_nil end end end diff --git a/spec/serializers/deploy_key_entity_spec.rb b/spec/serializers/deploy_keys/basic_deploy_key_entity_spec.rb similarity index 87% rename from spec/serializers/deploy_key_entity_spec.rb rename to spec/serializers/deploy_keys/basic_deploy_key_entity_spec.rb index e8d9701be6778373619c0be120b8d76338ec7097..c39eb14e339d15e4d69d28d589e12fb5153a8194 100644 --- a/spec/serializers/deploy_key_entity_spec.rb +++ b/spec/serializers/deploy_keys/basic_deploy_key_entity_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe DeployKeyEntity do +RSpec.describe DeployKeys::BasicDeployKeyEntity do include RequestAwareEntity let(:user) { create(:user) } @@ -18,7 +18,7 @@ project_private.deploy_keys << deploy_key end - describe 'returns deploy keys with projects a user can read' do + describe 'returns deploy keys' do let(:expected_result) do { id: deploy_key.id, @@ -30,19 +30,7 @@ almost_orphaned: false, created_at: deploy_key.created_at, updated_at: deploy_key.updated_at, - can_edit: false, - deploy_keys_projects: [ - { - can_push: false, - project: - { - id: project.id, - name: project.name, - full_path: project_path(project), - full_name: project.full_name - } - } - ] + can_edit: false } end diff --git a/spec/serializers/deploy_keys/deploy_key_entity_spec.rb b/spec/serializers/deploy_keys/deploy_key_entity_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..e989aa8656c80a107859cfc43307e622119a8a1d --- /dev/null +++ b/spec/serializers/deploy_keys/deploy_key_entity_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe DeployKeys::DeployKeyEntity do + include RequestAwareEntity + + let(:user) { create(:user) } + let(:project) { create(:project, :internal)} + let(:project_private) { create(:project, :private)} + let(:deploy_key) { create(:deploy_key) } + let(:options) { { user: user } } + + let(:entity) { described_class.new(deploy_key, options) } + + before do + project.deploy_keys << deploy_key + project_private.deploy_keys << deploy_key + end + + describe 'returns deploy keys with projects a user can read' do + let(:expected_result) do + { + id: deploy_key.id, + user_id: deploy_key.user_id, + title: deploy_key.title, + fingerprint: deploy_key.fingerprint, + fingerprint_sha256: deploy_key.fingerprint_sha256, + destroyed_when_orphaned: true, + almost_orphaned: false, + created_at: deploy_key.created_at, + updated_at: deploy_key.updated_at, + can_edit: false, + deploy_keys_projects: [ + { + can_push: false, + project: + { + id: project.id, + name: project.name, + full_path: project_path(project), + full_name: project.full_name + } + } + ] + } + end + + it { expect(entity.as_json).to eq(expected_result) } + end +end