cartodb/lib/tasks/google_services.rake
2020-06-15 10:58:47 +08:00

190 lines
7.6 KiB
Ruby

namespace :cartodb do
namespace :services do
namespace :external do
namespace :google do
def add_feature_flag_if_not_exists(name, restricted = true)
ff = Carto::FeatureFlag.where(name: name).first
if ff.nil?
ff = Carto::FeatureFlag.new(name: name, restricted: restricted)
ff.id = Carto::FeatureFlag.order(:id).last.id + 1
ff.restricted = restricted
elsif ff.restricted != restricted
ff.restricted = restricted
end
ff.save
end
def add_feature_flag_to_user(feature_name, user)
ff = Carto::FeatureFlag.where(name: feature_name).first
raise "No such feature flag '#{feature_name}'" if ff.nil?
return if Carto::FeatureFlagsUser.where(feature_flag_id: ff.id, user_id: user.id).exists?
Carto::FeatureFlagsUser.create(feature_flag_id: ff.id, user_id: user.id)
end
def remove_feature_flag_from_user(feature_name, user)
ff = Carto::FeatureFlag.where(name: feature_name).first
raise "No such feature flag '#{feature_name}'" if ff.nil?
ffu = Carto::FeatureFlagsUser.where(feature_flag_id: ff.id, user_id: user.id).first
if ffu.nil?
puts "[BUG] no feature flag user for feature '#{feature_name}' and '#{user.username}'"
else
ffu.destroy
end
end
def remove_feature_flag_if_exists(name)
ff = Carto::FeatureFlag.where(name: name).first
ff.destroy unless ff.nil?
end
def prepend_client_equal_if_needed(key)
key.downcase.start_with?('client=') ? key : "client=#{key}"
end
desc 'Enable Google Services for a given user'
task :enable_for_user, [:google_maps_key, :google_maps_private_key, :username] => [:environment] do |_, args|
add_feature_flag_if_not_exists('google_maps')
user = ::User.where(username: args[:username]).first
raise "No user with username '#{args[:username]}'" if user.nil?
puts "Enabling 'google_maps' feature flag for user '#{user.username}'"
add_feature_flag_to_user('google_maps', user)
puts "Enabling google services for user '#{user.username}'..."
user.google_maps_key = prepend_client_equal_if_needed(args[:google_maps_key])
user.google_maps_private_key = args[:google_maps_private_key] unless args[:google_maps_private_key].blank?
puts user.errors.full_messages unless user.save
end
desc 'Enable Google Services for an organization'
task :enable_for_organization,
[:google_maps_key, :google_maps_private_key, :org_name] => [:environment] do |_, args|
add_feature_flag_if_not_exists('google_maps')
organization = ::Organization.where(name: args[:org_name]).first
raise "No organization with name '#{args[:org_name]}'" if organization.nil?
puts "Enabling 'google_maps' feature flag for users in '#{organization.name}'"
organization.users.each do |user|
puts "\tenabling 'google_maps' feature flag for user '#{user.username}'"
add_feature_flag_to_user('google_maps', user)
end
puts "Enabling google services for organization '#{organization.name}'..."
organization.google_maps_key = prepend_client_equal_if_needed(args[:google_maps_key])
unless args[:google_maps_private_key].blank?
organization.google_maps_private_key = args[:google_maps_private_key]
end
puts organization.errors.full_messages unless organization.save
end
desc 'Enable Google Services for all users'
task :enable_for_all, [:google_maps_key, :google_maps_private_key] => [:environment] do |_, args|
add_feature_flag_if_not_exists('google_maps')
::Organization.all.each do |organization|
puts "Enabling 'google_maps' feature flag for users in '#{organization.name}'"
organization.users.each do |user|
puts "\tenabling 'google_maps' feature flag for user '#{user.username}'"
add_feature_flag_to_user('google_maps', user)
end
puts "Enabling google services for organization '#{organization.name}'..."
organization.google_maps_key = prepend_client_equal_if_needed(args[:google_maps_key])
unless args[:google_maps_private_key].blank?
organization.google_maps_private_key = args[:google_maps_private_key]
end
puts organization.errors.full_messages unless organization.save
end
# For users not in organizations
::User.where(organization_id: nil).each do |user|
puts "Enabling 'google_maps' feature flag for user '#{user.username}'"
add_feature_flag_to_user('google_maps', user)
puts "Enabling google services for non-organization user '#{user.username}'..."
user.google_maps_key = prepend_client_equal_if_needed(args[:google_maps_key])
user.google_maps_private_key = args[:google_maps_private_key] unless args[:google_maps_private_key].blank?
puts user.errors.full_messages unless user.save
end
end
desc 'Disable Google Services for a given user'
task :disable_for_user, [:username] => [:environment] do |_, args|
user = ::User.where(username: args[:username]).first
raise "No user with username '#{args[:username]}'" if user.nil?
puts "Removing 'google_maps' feature flag from user '#{user.username}'"
remove_feature_flag_from_user('google_maps', user)
puts "Disabling google services for user '#{user.username}'..."
user.google_maps_key = nil
user.google_maps_private_key = nil
puts user.errors.full_messages unless user.save
end
desc 'Disable Google Services for an organization'
task :disable_for_organization, [:org_name] => [:environment] do |_, args|
organization = ::Organization.where(name: args[:org_name]).first
raise "No organization with name '#{args[:org_name]}'" if organization.nil?
puts "Removing 'google_maps' feature flag from users in '#{organization.name}'"
organization.users.each do |user|
puts "\tremoving 'google_maps' feature flag from user '#{user.username}'"
remove_feature_flag_from_user('google_maps', user)
end
puts "Disabling google services for organization '#{organization.name}'..."
organization.google_maps_key = nil
organization.google_maps_private_key = nil
puts organization.errors.full_messages unless organization.save
end
desc 'Disable Google Services for all users'
task disable_for_all: [:environment] do |_|
remove_feature_flag_if_exists('google_maps')
::Organization.all.each do |organization|
puts "Disabling google services for organization '#{organization.name}'..."
organization.google_maps_key = nil
organization.google_maps_private_key = nil
puts organization.errors.full_messages unless organization.save
end
# For users not in organizations
::User.where(organization_id: nil).each do |user|
puts "Disabling google services for non-organization user '#{user.username}'..."
user.google_maps_key = nil
user.google_maps_private_key = nil
puts user.errors.full_messages unless user.save
end
end
end
end
end
end