Use polymorphism for common attributes in `GroupChildEntity`
This commit is contained in:
parent
bd8943f5ad
commit
8cde1e3285
|
@ -6,33 +6,25 @@ class GroupChildEntity < Grape::Entity
|
|||
:created_at, :updated_at, :avatar_url
|
||||
|
||||
expose :type do |instance|
|
||||
instance.class.name.downcase
|
||||
type
|
||||
end
|
||||
|
||||
expose :can_edit do |instance|
|
||||
return false unless request.respond_to?(:current_user)
|
||||
|
||||
if project?
|
||||
can?(request.current_user, :admin_project, instance)
|
||||
else
|
||||
can?(request.current_user, :admin_group, instance)
|
||||
end
|
||||
can?(request.current_user, "admin_#{type}", instance)
|
||||
end
|
||||
|
||||
expose :edit_path do |instance|
|
||||
if project?
|
||||
edit_project_path(instance)
|
||||
else
|
||||
edit_group_path(instance)
|
||||
end
|
||||
# We know `type` will be one either `project` or `group`.
|
||||
# The `edit_polymorphic_path` helper would try to call the path helper
|
||||
# with a plural: `edit_groups_path(instance)` or `edit_projects_path(instance)`
|
||||
# while our methods are `edit_group_path` or `edit_group_path`
|
||||
public_send("edit_#{type}_path", instance) # rubocop:disable GitlabSecurity/PublicSend
|
||||
end
|
||||
|
||||
expose :relative_path do |instance|
|
||||
if project?
|
||||
project_path(instance)
|
||||
else
|
||||
group_path(instance)
|
||||
end
|
||||
polymorphic_path(instance)
|
||||
end
|
||||
|
||||
expose :permission do |instance|
|
||||
|
@ -78,4 +70,8 @@ class GroupChildEntity < Grape::Entity
|
|||
def project?
|
||||
object.is_a?(Project)
|
||||
end
|
||||
|
||||
def type
|
||||
object.class.name.downcase
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe GroupChildEntity do
|
||||
include Gitlab::Routing.url_helpers
|
||||
|
||||
let(:user) { create(:user) }
|
||||
let(:request) { double('request') }
|
||||
let(:entity) { described_class.new(object, request: request) }
|
||||
|
@ -24,7 +26,6 @@ describe GroupChildEntity do
|
|||
type
|
||||
can_edit
|
||||
visibility
|
||||
edit_path
|
||||
permission
|
||||
relative_path].each do |attribute|
|
||||
it "includes #{attribute}" do
|
||||
|
@ -51,6 +52,10 @@ describe GroupChildEntity do
|
|||
expect(json[:star_count]).to be_present
|
||||
end
|
||||
|
||||
it 'has the correct edit path' do
|
||||
expect(json[:edit_path]).to eq(edit_project_path(object))
|
||||
end
|
||||
|
||||
it_behaves_like 'group child json'
|
||||
end
|
||||
|
||||
|
@ -87,6 +92,10 @@ describe GroupChildEntity do
|
|||
expect(json[:can_leave]).to be_truthy
|
||||
end
|
||||
|
||||
it 'has the correct edit path' do
|
||||
expect(json[:edit_path]).to eq(edit_group_path(object))
|
||||
end
|
||||
|
||||
it_behaves_like 'group child json'
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue