cartodb-4.42/lib/tasks/enable_feature.rake
2024-04-06 05:25:13 +00:00

192 lines
7.8 KiB
Ruby

namespace :cartodb do
namespace :features do
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "enable feature for all users"
task :enable_feature_for_all_users, [:feature] => :environment do |t, args|
ff = Carto::FeatureFlag.find_by(name: args[:feature])
raise "[ERROR] Feature '#{args[:feature]}' does not exist" if ff.nil?
Carto::User.find_each do |user|
if !Carto::FeatureFlagsUser.exists?(feature_flag: ff, user: user)
user.activate_feature_flag!(ff)
track_feature_flag_state(user.id, args[:feature], 'enabled')
end
end
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "enable feature for a given user"
task :enable_feature_for_user, [:feature, :username] => :environment do |t, args|
ff = Carto::FeatureFlag.find_by(name: args[:feature])
raise "[ERROR] Feature '#{args[:feature]}' does not exist" if ff.nil?
user = Carto::User.find_by(username: args[:username])
raise "[ERROR] User '#{args[:username]}' does not exist" if user.nil?
if !Carto::FeatureFlagsUser.exists?(feature_flag: ff, user: user)
user.activate_feature_flag!(ff)
track_feature_flag_state(user.id, args[:feature], 'enabled')
else
puts "[INFO] Feature '#{args[:feature]}' was already enabled for user '#{args[:username]}'"
end
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "enable feature for a given organization"
task :enable_feature_for_organization, [:feature, :org_name] => :environment do |t, args|
ff = Carto::FeatureFlag.find_by(name: args[:feature])
raise "[ERROR] Feature '#{args[:feature]}' does not exist" if ff.nil?
organization = Carto::Organization.find_by(name: args[:org_name])
raise "[ERROR] Organization '#{args[:org_name]}' does not exist" if organization.nil?
organization.users.each do |user|
if !Carto::FeatureFlagsUser.exists?(feature_flag: ff, user: user)
user.activate_feature_flag!(ff)
track_feature_flag_state(user.id, args[:feature], 'enabled')
end
end
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "disable feature for all users"
task :disable_feature_for_all_users, [:feature] => :environment do |t, args|
ff = Carto::FeatureFlag.find_by(name: args[:feature])
raise "[ERROR] Feature '#{args[:feature]}' does not exist" if ff.nil?
ffus = Carto::FeatureFlagsUser.where(feature_flag: ff)
if ffus.nil?
puts "[INFO] No users had feature '#{args[:feature]}' enabled"
else
ffus.destroy_all
end
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "disable feature for a given user"
task :disable_feature_for_user, [:feature, :username] => :environment do |t, args|
ff = Carto::FeatureFlag.find_by(name: args[:feature])
raise "[ERROR] Feature '#{args[:feature]}' does not exist" if ff.nil?
user = Carto::User.find_by(username: args[:username])
raise "[ERROR] User '#{args[:username]}' does not exist" if user.nil?
if !Carto::FeatureFlagsUser.exists?(feature_flag: ff, user: user)
puts "[INFO] Feature '#{args[:feature]}' was already disabled for user '#{args[:username]}'"
else
Carto::FeatureFlagsUser.where(feature_flag: ff, user: user).destroy_all
track_feature_flag_state(user.id, args[:feature], 'disabled')
end
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "disable feature for a given organization"
task :disable_feature_for_organization, [:feature, :org_name] => :environment do |t, args|
ff = Carto::FeatureFlag.find_by(name: args[:feature])
raise "[ERROR] Feature '#{args[:feature]}' does not exist" if ff.nil?
organization = Carto::Organization.find_by(name: args[:org_name])
raise "[ERROR] Organization '#{args[:org_name]}' does not exist" if organization.nil?
organization.users.each do |user|
if !Carto::FeatureFlagsUser.exists?(feature_flag: ff, user: user)
puts "[INFO] Feature '#{args[:feature]}' was already disabled for user '#{args[:username]}'"
else
Carto::FeatureFlagsUser.where(feature_flag: ff, user: user).destroy_all
track_feature_flag_state(user.id, args[:feature], 'disabled')
end
end
end
def track_feature_flag_state(user_id, feature, state)
properties = {
user_id: user_id,
feature_flag: {
feature: feature,
state: state
}
}
Carto::Tracking::Events::UpdatedFeatureFlag.new(user_id, properties).report
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "add feature flag and optionally set restricted (default is true)"
task :add_feature_flag, [:feature, :restricted] => :environment do |_task, args|
restricted = args[:restricted] ? args[:restricted].casecmp('false') != 0 : true
ff = Carto::FeatureFlag.find_by(name: args[:feature])
if !ff
ff = Carto::FeatureFlag.new(name: args[:feature], restricted: restricted)
ff.id = Carto::FeatureFlag.any? ? Carto::FeatureFlag.order(:id).last.id + 1 : 0
ff.save
puts "[INFO]\tFeature flag '#{args[:feature]}' created and restricted set to '#{ff.restricted}'"
else
raise "[ERROR]\tFeature '#{args[:feature]}' already exists and its restricted set to '#{ff.restricted}'"
end
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "change feature flag to restricted or unrestricted"
task :change_feature_restricted, [:feature, :restricted] => :environment do |_task, args|
restricted = args[:restricted] ? args[:restricted].casecmp('false') != 0 : true
ff = Carto::FeatureFlag.find_by(name: args[:feature])
if ff
ff.restricted = restricted
ff.save
puts "[INFO]\tFeature flag '#{args[:feature]}' restricted set to '#{ff.restricted}'"
else
raise "[ERROR]\tFeature '#{args[:feature]}' doesn't exist"
end
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "remove feature flag"
task :remove_feature_flag, [:feature] => :environment do |t, args|
ff = Carto::FeatureFlag.find_by(name: args[:feature])
raise "[ERROR] Feature '#{args[:feature]}' does not exist" if ff.nil?
ffus = Carto::FeatureFlagsUser.where(feature_flag: ff)
if ffus.nil?
puts "[INFO] No users had feature '#{args[:feature]}' enabled"
else
ffus.destroy_all
end
ff.destroy()
end
# WARNING: For use only at development, opensource and custom installs.
# Refer to https://github.com/CartoDB/cartodb-management/wiki/Feature-Flags
desc "list all features"
task :list_all_features => :environment do
puts "Available features:"
Carto::FeatureFlag.find_each do |feature|
puts " - #{feature.name}"
end
end
end # Features
end # CartoDB