Commit 8cde1e32 authored by Bob Van Landuyt's avatar Bob Van Landuyt

Use polymorphism for common attributes in `GroupChildEntity`

parent bd8943f5
...@@ -6,33 +6,25 @@ class GroupChildEntity < Grape::Entity ...@@ -6,33 +6,25 @@ class GroupChildEntity < Grape::Entity
:created_at, :updated_at, :avatar_url :created_at, :updated_at, :avatar_url
expose :type do |instance| expose :type do |instance|
instance.class.name.downcase type
end end
expose :can_edit do |instance| expose :can_edit do |instance|
return false unless request.respond_to?(:current_user) return false unless request.respond_to?(:current_user)
if project? can?(request.current_user, "admin_#{type}", instance)
can?(request.current_user, :admin_project, instance)
else
can?(request.current_user, :admin_group, instance)
end
end end
expose :edit_path do |instance| expose :edit_path do |instance|
if project? # We know `type` will be one either `project` or `group`.
edit_project_path(instance) # The `edit_polymorphic_path` helper would try to call the path helper
else # with a plural: `edit_groups_path(instance)` or `edit_projects_path(instance)`
edit_group_path(instance) # while our methods are `edit_group_path` or `edit_group_path`
end public_send("edit_#{type}_path", instance) # rubocop:disable GitlabSecurity/PublicSend
end end
expose :relative_path do |instance| expose :relative_path do |instance|
if project? polymorphic_path(instance)
project_path(instance)
else
group_path(instance)
end
end end
expose :permission do |instance| expose :permission do |instance|
...@@ -78,4 +70,8 @@ class GroupChildEntity < Grape::Entity ...@@ -78,4 +70,8 @@ class GroupChildEntity < Grape::Entity
def project? def project?
object.is_a?(Project) object.is_a?(Project)
end end
def type
object.class.name.downcase
end
end end
require 'spec_helper' require 'spec_helper'
describe GroupChildEntity do describe GroupChildEntity do
include Gitlab::Routing.url_helpers
let(:user) { create(:user) } let(:user) { create(:user) }
let(:request) { double('request') } let(:request) { double('request') }
let(:entity) { described_class.new(object, request: request) } let(:entity) { described_class.new(object, request: request) }
...@@ -24,7 +26,6 @@ describe GroupChildEntity do ...@@ -24,7 +26,6 @@ describe GroupChildEntity do
type type
can_edit can_edit
visibility visibility
edit_path
permission permission
relative_path].each do |attribute| relative_path].each do |attribute|
it "includes #{attribute}" do it "includes #{attribute}" do
...@@ -51,6 +52,10 @@ describe GroupChildEntity do ...@@ -51,6 +52,10 @@ describe GroupChildEntity do
expect(json[:star_count]).to be_present expect(json[:star_count]).to be_present
end 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' it_behaves_like 'group child json'
end end
...@@ -87,6 +92,10 @@ describe GroupChildEntity do ...@@ -87,6 +92,10 @@ describe GroupChildEntity do
expect(json[:can_leave]).to be_truthy expect(json[:can_leave]).to be_truthy
end 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' it_behaves_like 'group child json'
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment