SharedEntity refactor

pull/12089/head
Juan Ignacio Sánchez Lara 7 years ago
parent 6e7cd1e824
commit 0696084159

@ -217,6 +217,7 @@ WORKING_SPECS_9 = \
spec/models/access_token_spec.rb \
spec/requests/carto/api/permissions_controller_spec.rb \
spec/models/shared_entity_spec.rb \
spec/models/carto/shared_entity_spec.rb \
spec/requests/signup_controller_spec.rb \
spec/requests/account_tokens_controller_spec.rb \
spec/requests/superadmin/users_spec.rb \

@ -283,12 +283,12 @@ class Carto::Permission < ActiveRecord::Base
users = relevant_user_acl_entries(acl)
# Avoid entries without recipient id. See #5668.
users.select { |u| u[:id] }.each do |user|
shared_entity = CartoDB::SharedEntity.new(
shared_entity = Carto::SharedEntity.create(
recipient_id: user[:id],
recipient_type: CartoDB::SharedEntity::RECIPIENT_TYPE_USER,
recipient_type: Carto::SharedEntity::RECIPIENT_TYPE_USER,
entity_id: entity.id,
entity_type: CartoDB::SharedEntity::ENTITY_TYPE_VISUALIZATION
).save
entity_type: Carto::SharedEntity::ENTITY_TYPE_VISUALIZATION
)
if e.table?
grant_db_permission(e, user[:access], shared_entity)
@ -297,12 +297,12 @@ class Carto::Permission < ActiveRecord::Base
org = relevant_org_acl_entry(acl)
if org
shared_entity = CartoDB::SharedEntity.new(
shared_entity = Carto::SharedEntity.create(
recipient_id: org[:id],
recipient_type: CartoDB::SharedEntity::RECIPIENT_TYPE_ORGANIZATION,
recipient_type: Carto::SharedEntity::RECIPIENT_TYPE_ORGANIZATION,
entity_id: entity.id,
entity_type: CartoDB::SharedEntity::ENTITY_TYPE_VISUALIZATION
).save
entity_type: Carto::SharedEntity::ENTITY_TYPE_VISUALIZATION
)
if e.table?
grant_db_permission(e, org[:access], shared_entity)
@ -311,12 +311,12 @@ class Carto::Permission < ActiveRecord::Base
groups = relevant_groups_acl_entries(acl)
groups.each do |group|
CartoDB::SharedEntity.new(
Carto::SharedEntity.create(
recipient_id: group[:id],
recipient_type: CartoDB::SharedEntity::RECIPIENT_TYPE_GROUP,
recipient_type: Carto::SharedEntity::RECIPIENT_TYPE_GROUP,
entity_id: entity.id,
entity_type: CartoDB::SharedEntity::ENTITY_TYPE_VISUALIZATION
).save
entity_type: Carto::SharedEntity::ENTITY_TYPE_VISUALIZATION
)
# You only want to switch it off when request is a permission request coming from database
if e.table? && @update_db_group_permission != false
@ -328,7 +328,7 @@ class Carto::Permission < ActiveRecord::Base
end
def destroy_shared_entities
CartoDB::SharedEntity.where(entity_id: entity.id).delete
Carto::SharedEntity.where(entity_id: entity.id).each(&:destroy)
end
def revoke_previous_permissions(entity)
@ -401,7 +401,7 @@ class Carto::Permission < ActiveRecord::Base
end
def grant_db_permission(entity, access, shared_entity)
if shared_entity.recipient_type == CartoDB::SharedEntity::RECIPIENT_TYPE_ORGANIZATION
if shared_entity.recipient_type == Carto::SharedEntity::RECIPIENT_TYPE_ORGANIZATION
permission_strategy = CartoDB::OrganizationPermission.new
else
u = Carto::User.find(shared_entity[:recipient_id])

@ -3,17 +3,30 @@ require_relative '../shared_entity'
module Carto
class SharedEntity < ActiveRecord::Base
ENTITY_TYPE_VISUALIZATION = CartoDB::SharedEntity::ENTITY_TYPE_VISUALIZATION
ENTITY_TYPE_VISUALIZATION = 'vis'
RECIPIENT_TYPE_USER = 'user'
RECIPIENT_TYPE_ORGANIZATION = 'org'
RECIPIENT_TYPE_GROUP = 'group'
scope :shared_visualizations, where(entity_type: ENTITY_TYPE_VISUALIZATION)
belongs_to :visualization, foreign_key: :entity_id, inverse_of: :shared_entities
attr_accessible :entity_id, :recipient_id
validates :recipient_id, :recipient_type, :entity_id, :entity_type, presence: true
validates :recipient_id, uniqueness: { scope: :entity_id, message: 'is already taken' }
validate :supported_type
attr_accessible :entity_id, :recipient_id, :entity_type, :recipient_type
def self.columns
super.reject { |c| c.name == "id" }
end
private
def supported_type
errors.add(:entity_type, 'unsupported type') unless self.entity_type == ENTITY_TYPE_VISUALIZATION
end
end
end

@ -0,0 +1,10 @@
# coding: UTF-8
require_relative '../shared_entity_shared_examples'
describe Carto::SharedEntity do
it_behaves_like 'shared entity models' do
def shared_entity_class
Carto::SharedEntity
end
end
end

@ -0,0 +1,81 @@
require_relative '../spec_helper'
shared_examples_for 'shared entity models' do
before(:all) do
CartoDB::Varnish.any_instance.stubs(:send_command).returns(true)
@user = create_user(:quota_in_bytes => 524288000, :table_quota => 500)
end
after(:all) do
bypass_named_maps
@user.destroy
end
describe '#create' do
it 'tests basic creation and validation' do
recipient_id = UUIDTools::UUID.timestamp_create.to_s
entity_id = UUIDTools::UUID.timestamp_create.to_s
shared_entity_class.where(entity_id: entity_id).count.should eq 0
shared_entity = shared_entity_class.new(
recipient_id: recipient_id,
recipient_type: shared_entity_class::RECIPIENT_TYPE_USER,
entity_id: entity_id,
entity_type: shared_entity_class::ENTITY_TYPE_VISUALIZATION
)
shared_entity.valid?.should eq true
shared_entity.errors.should be_empty
shared_entity.save
shared_entity_class.where(entity_id: entity_id).count.should eq 1
shared_entity2 = shared_entity_class.new(
recipient_id: recipient_id,
recipient_type: shared_entity_class::RECIPIENT_TYPE_USER,
entity_id: entity_id,
entity_type: shared_entity_class::ENTITY_TYPE_VISUALIZATION
)
shared_entity2.valid?.should eq false
# Workaround for cross-ORM compatibility
# shared_entity2.errors.should eq({[:recipient_id, :entity_id]=>['is already taken']})
shared_entity2.errors.values.should eq([["is already taken"]])
shared_entity.destroy
shared_entity_class.where(entity_id: entity_id).count.should eq 0
shared_entity = shared_entity_class.new(
recipient_id: entity_id,
recipient_type: shared_entity_class::RECIPIENT_TYPE_USER,
entity_type: shared_entity_class::ENTITY_TYPE_VISUALIZATION
)
shared_entity.valid?.should eq false
shared_entity = shared_entity_class.new(
recipient_id: recipient_id,
recipient_type: shared_entity_class::RECIPIENT_TYPE_USER,
entity_type: shared_entity_class::ENTITY_TYPE_VISUALIZATION
)
shared_entity.valid?.should eq false
shared_entity = shared_entity_class.new(
recipient_id: recipient_id,
recipient_type: shared_entity_class::RECIPIENT_TYPE_USER,
entity_id: entity_id,
)
shared_entity.valid?.should eq false
shared_entity = shared_entity_class.new(
)
shared_entity.valid?.should eq false
shared_entity = shared_entity_class.new(
recipient_id: recipient_id,
recipient_type: shared_entity_class::RECIPIENT_TYPE_USER,
entity_id: entity_id,
entity_type: 'whatever'
)
shared_entity.valid?.should eq false
end
end
end

@ -1,87 +1,10 @@
# coding: UTF-8
require_relative '../spec_helper'
include CartoDB
require_relative 'shared_entity_shared_examples'
describe CartoDB::SharedEntity do
before(:all) do
CartoDB::Varnish.any_instance.stubs(:send_command).returns(true)
@user = create_user(:quota_in_bytes => 524288000, :table_quota => 500)
end
after(:all) do
bypass_named_maps
@user.destroy
end
describe '#create' do
it 'tests basic creation and validation' do
recipient_id = UUIDTools::UUID.timestamp_create.to_s
entity_id = UUIDTools::UUID.timestamp_create.to_s
SharedEntity.where(entity_id: entity_id).count.should eq 0
shared_entity = SharedEntity.new(
recipient_id: recipient_id,
recipient_type: SharedEntity::RECIPIENT_TYPE_USER,
entity_id: entity_id,
entity_type: SharedEntity::ENTITY_TYPE_VISUALIZATION
)
shared_entity.valid?.should eq true
shared_entity.errors.should eq Hash.new
shared_entity.save
SharedEntity.where(entity_id: entity_id).count.should eq 1
shared_entity2 = SharedEntity.new(
recipient_id: recipient_id,
recipient_type: SharedEntity::RECIPIENT_TYPE_USER,
entity_id: entity_id,
entity_type: SharedEntity::ENTITY_TYPE_VISUALIZATION
)
shared_entity2.valid?.should eq false
shared_entity2.errors.should eq({[:recipient_id, :entity_id]=>['is already taken']})
shared_entity.destroy
SharedEntity.where(entity_id: entity_id).count.should eq 0
shared_entity = SharedEntity.new(
recipient_id: entity_id,
recipient_type: SharedEntity::RECIPIENT_TYPE_USER,
entity_type: SharedEntity::ENTITY_TYPE_VISUALIZATION
)
shared_entity.valid?.should eq false
shared_entity = SharedEntity.new(
recipient_id: recipient_id,
recipient_type: SharedEntity::RECIPIENT_TYPE_USER,
entity_type: SharedEntity::ENTITY_TYPE_VISUALIZATION
)
shared_entity.valid?.should eq false
shared_entity = SharedEntity.new(
recipient_id: recipient_id,
recipient_type: SharedEntity::RECIPIENT_TYPE_USER,
entity_id: entity_id,
)
shared_entity.valid?.should eq false
shared_entity = SharedEntity.new(
)
shared_entity.valid?.should eq false
shared_entity = SharedEntity.new(
recipient_id: recipient_id,
recipient_type: SharedEntity::RECIPIENT_TYPE_USER,
entity_id: entity_id,
entity_type: 'whatever'
)
shared_entity.valid?.should eq false
it_behaves_like 'shared entity models' do
def shared_entity_class
CartoDB::SharedEntity
end
end
end

Loading…
Cancel
Save