limit public maps

pull/14892/head
Gonzalo Riestra 5 years ago
parent df8f60f8c5
commit 5e0b9e40be

@ -47,7 +47,8 @@ class Carto::User < ActiveRecord::Base
"users.builder_enabled, users.private_tables_enabled, users.private_maps_enabled, " \
"users.org_admin, users.last_name, users.google_maps_private_key, users.website, " \
"users.description, users.available_for_hire, users.frontend_version, users.asset_host, "\
"users.no_map_logo, users.industry, users.company, users.phone, users.job_role".freeze
"users.no_map_logo, users.industry, users.company, users.phone, users.job_role, "\
"users.public_map_quota".freeze
has_many :tables, class_name: Carto::UserTable, inverse_of: :user
has_many :visualizations, inverse_of: :user

@ -759,8 +759,13 @@ class Carto::Visualization < ActiveRecord::Base
end
def validate_privacy_changes
if derived? && is_privacy_private? && privacy_changed? && !user.try(:private_maps_enabled?)
return unless privacy_changed?
if derived? && is_privacy_private? && !user.try(:private_maps_enabled?)
errors.add(:privacy, 'cannot be set to private')
elsif privacy_was == Carto::Visualization::PRIVACY_PRIVATE &&
CartoDB::QuotaChecker.new(user).will_be_over_public_map_quota?
errors.add(:privacy, 'over account public map quota')
end
end

@ -4,21 +4,48 @@ module CartoDB
class QuotaChecker
def initialize(user)
@user = user
end
end
def will_be_over_table_quota?(number_of_new_tables)
return false unless user.remaining_table_quota
number_of_new_tables.to_i > user.remaining_table_quota.to_i
end
def over_table_quota?
return false unless user.remaining_table_quota
user.tables.count > user.table_quota.to_i
end
def will_be_over_public_map_quota?
return false unless user.public_map_quota
public_map_count >= user.public_map_quota
end
def over_public_map_quota?
return false unless user.public_map_quota
public_map_count > user.public_map_quota
end
private
attr_reader :user
end # QuotaChecker
end # CartoDB
def public_map_count
not_private = [
Carto::Visualization::PRIVACY_PUBLIC,
Carto::Visualization::PRIVACY_LINK,
Carto::Visualization::PRIVACY_PROTECTED
]
query_builder = Carto::VisualizationQueryBuilder.new.
with_user_id(@user.id).
with_type(Carto::Visualization::TYPE_DERIVED).
with_privacy(not_private)
query_builder.build.count
end
attr_reader :user
end
end

@ -622,4 +622,39 @@ describe Carto::Visualization do
end
end
end
context 'quota check' do
before(:each) do
@carto_user.private_maps_enabled = true
@carto_user.save
@visualization = FactoryGirl.create(:carto_visualization, user: @carto_user,
privacy: Carto::Visualization::PRIVACY_PRIVATE)
end
after(:all) do
@carto_user.public_map_quota = nil
@carto_user.save
end
it 'does not allow to make a map public when the limit is reached' do
@carto_user.public_map_quota = 0
@carto_user.save
@visualization.privacy = Carto::Visualization::PRIVACY_PUBLIC
@visualization.save
@visualization.reload.privacy.should eql Carto::Visualization::PRIVACY_PRIVATE
@visualization.errors.count.should eql 1
end
it 'allows to make the map public if the limit is not reached' do
@user.public_map_quota = 1
@user.save
@visualization.privacy = Carto::Visualization::PRIVACY_PUBLIC
@visualization.save
@visualization.reload.privacy.should eql Carto::Visualization::PRIVACY_PUBLIC
end
end
end

@ -2655,6 +2655,45 @@ describe Carto::Api::VisualizationsController do
visualization.data_layers.count.should eq 1
end
end
describe '#update' do
after(:all) do
@carto_user1.private_maps_enabled = false
@carto_user1.public_map_quota = nil
@carto_user1.save
end
it 'returns a 200 response when making a map public with enough quota' do
@carto_user1.private_maps_enabled = true
@carto_user1.public_map_quota = nil
@carto_user1.save
visualization = FactoryGirl.create(:carto_visualization, user: @carto_user1,
privacy: Carto::Visualization::PRIVACY_PRIVATE)
request_params = { user_domain: @carto_user1.username, api_key: @carto_user1.api_key, id: visualization.id }
put api_v1_visualizations_update_url(request_params),
{ id: visualization.id, privacy: CartoDB::Visualization::Member::PRIVACY_PUBLIC }.to_json,
@headers
last_response.status.should == 200
end
it 'returns a 400 response when making a map public without enough quota' do
@carto_user1.private_maps_enabled = true
@carto_user1.public_map_quota = 0
@carto_user1.save
visualization = FactoryGirl.create(:carto_visualization, user: @carto_user1,
privacy: Carto::Visualization::PRIVACY_PRIVATE)
request_params = { user_domain: @carto_user1.username, api_key: @carto_user1.api_key, id: visualization.id }
put api_v1_visualizations_update_url(request_params),
{ id: visualization.id, privacy: CartoDB::Visualization::Member::PRIVACY_PUBLIC }.to_json,
@headers
last_response.status.should == 400
last_response.body.should =~ /public map quota/
end
end
end
describe 'index' do

Loading…
Cancel
Save