mirror of
https://github.com/indentlabs/notebook.git
synced 2025-10-26 11:19:22 +00:00
281 lines
11 KiB
Ruby
281 lines
11 KiB
Ruby
namespace :data_migrations do
|
|
desc "Create PageReferences for all text fields"
|
|
task create_text_field_page_references: :environment do
|
|
Attribute.where.not(value: [nil, ""]).find_each do |attribute|
|
|
tokens = ContentFormatterService.tokens_to_replace(attribute.value)
|
|
|
|
if tokens.any?
|
|
field = attribute.attribute_field
|
|
entity = attribute.entity
|
|
next unless field.present? && entity.present?
|
|
|
|
tokens.each do |token|
|
|
reference = entity.outgoing_page_references.find_or_initialize_by(
|
|
referenced_page_type: token[:content_type],
|
|
referenced_page_id: token[:content_id],
|
|
attribute_field_id: field.id,
|
|
reference_type: 'mentioned'
|
|
)
|
|
reference.cached_relation_title = field.label
|
|
reference.save!
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
desc "Create PageReferences for all the old content linkers"
|
|
task create_content_linker_page_references: :environment do
|
|
# require 'pry'
|
|
|
|
start_time = DateTime.current
|
|
puts "Starting the long migration!"
|
|
|
|
# Turn off SQL logging
|
|
old_logger = ActiveRecord::Base.logger
|
|
ActiveRecord::Base.logger = nil
|
|
|
|
Rails.application.config.content_relations.each do |page_type, relation_list|
|
|
time_elapsed = DateTime.current - start_time
|
|
puts "Starting #{page_type} link migrations (T+#{time_elapsed.to_i})"
|
|
|
|
relation_list.each do |relation_name, relation_params|
|
|
link_class = relation_params[:related_class] # Fathership
|
|
|
|
referencing_page_type = relation_params[:inverse_class]
|
|
# puts relation_params[:through_relation]
|
|
# puts relation_params.inspect
|
|
# puts link_class.reflect_on_association(relation_params[:through_relation]).inspect
|
|
|
|
referenced_page_type = nil
|
|
if relation_params[:through_relation] == :deity && referencing_page_type == "Religion"
|
|
referenced_page_type = link_class.reflect_on_association(:deity_character).class_name
|
|
else
|
|
referenced_page_type = link_class.reflect_on_association(relation_params[:through_relation]).class_name
|
|
end
|
|
|
|
puts " Creating references for #{link_class.count} #{relation_name} links"
|
|
link_class.find_each do |link|
|
|
referencing_page = nil
|
|
referenced_page = nil
|
|
|
|
if link.class.name == Deityship.name
|
|
referencing_page = link.send(referencing_page_type.downcase)
|
|
referenced_page = link.send(:deity_character)
|
|
|
|
else
|
|
referencing_page = link.send(referencing_page_type.downcase)
|
|
referenced_page = link.send(relation_params[:through_relation])
|
|
end
|
|
|
|
if (referencing_page.nil? || referenced_page.nil? || referencing_page.user.nil? || referenced_page.user.nil?)
|
|
# Don't do anything here -- one of the pages has since been deleted
|
|
# puts " Skipping a deleted-page reference"
|
|
link.destroy
|
|
next
|
|
end
|
|
|
|
categories_for_this_page_type_and_user = AttributeCategory.where(
|
|
entity_type: referencing_page_type.downcase,
|
|
user_id: referencing_page.user_id
|
|
).pluck(:id)
|
|
|
|
# We also need to find the associated AttributeField (OMG) to make sure we
|
|
# tie the new references to that field.
|
|
attribute_field = AttributeField.where(
|
|
attribute_category_id: categories_for_this_page_type_and_user,
|
|
user_id: referencing_page.user_id,
|
|
field_type: 'link',
|
|
old_column_source: link.class.name == Deityship.name ? 'deity_characters' : relation_params[:through_relation].pluralize
|
|
)
|
|
|
|
if attribute_field.count > 1
|
|
# puts "Ambiguous fields"
|
|
# puts attribute_field.pluck(:id)
|
|
# raise "ambiguous fields"
|
|
end
|
|
|
|
attribute_field = attribute_field.first
|
|
if attribute_field.nil?
|
|
# Field has been deleted....?
|
|
link.destroy
|
|
next
|
|
end
|
|
|
|
# Debug
|
|
# puts " Referencing page: #{referencing_page_type}-#{referencing_page.id}"
|
|
# puts " Referenced page: #{referenced_page_type}-#{referenced_page.id}"
|
|
# puts " Attribute field: #{attribute_field.label} (#{attribute_field.id})"
|
|
# puts "OK?"
|
|
# binding.pry
|
|
|
|
# Create a simulated Attribute with the existing link's value(s)
|
|
attribute = Attribute.find_or_initialize_by(
|
|
user: referencing_page.user,
|
|
attribute_field_id: attribute_field.id,
|
|
entity_type: referencing_page_type,
|
|
entity_id: referencing_page.id
|
|
)
|
|
puts "Migrating attribute ID #{attribute.id}"
|
|
if attribute.value.nil?
|
|
attribute.value = JSON.parse('["' + referenced_page_type + '-' + referenced_page.id.to_s + '"]')
|
|
else
|
|
json_value = JSON.parse(attribute.value)
|
|
json_value << "#{referenced_page_type}-#{referenced_page.id.to_s}" unless json_value.include?("#{referenced_page_type}-#{referenced_page.id.to_s}")
|
|
attribute.value = json_value
|
|
end
|
|
attribute.save!
|
|
|
|
# Create the PageReference
|
|
reference = referencing_page.outgoing_page_references.find_or_initialize_by(
|
|
referenced_page_type: referenced_page_type,
|
|
referenced_page_id: referenced_page.id,
|
|
attribute_field_id: attribute_field.id,
|
|
reference_type: 'linked'
|
|
)
|
|
reference.cached_relation_title = attribute_field.label
|
|
if reference.save!
|
|
# ...delete the old link model?
|
|
link.destroy
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# Turn SQL logging back on
|
|
ActiveRecord::Base.logger = old_logger
|
|
|
|
puts "Done!"
|
|
puts "Total time elapsed: T+#{(DateTime.current - start_time).to_i}"
|
|
end
|
|
|
|
desc "Create activators for all used content types for all users"
|
|
task create_content_type_activators: :environment do
|
|
default_content_types = [
|
|
Universe, Character, Location, Item
|
|
]
|
|
variable_content_types = [
|
|
Creature, Flora, Group, Language, Magic, Race, Religion, Scene
|
|
]
|
|
|
|
User.where('id > 20000').find_each do |user|
|
|
puts "Creating activators for user #{user.id}" if (user.id % 1000).zero?
|
|
|
|
# These are default, but users can turn them off later
|
|
default_content_types.each do |content_type|
|
|
user.user_content_type_activators.find_or_create_by(content_type: content_type.name)
|
|
end
|
|
|
|
# Only turn these ones on if users have any existing content for them
|
|
variable_content_types.each do |content_type|
|
|
existing_content = user.send(content_type.name.downcase.pluralize).count > 0
|
|
|
|
if existing_content
|
|
user.user_content_type_activators.find_or_create_by(content_type: content_type.name)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
desc "Initialize Stripe customer ID for all users without one already"
|
|
task initialize_stripe_customers: :environment do
|
|
User.where(stripe_customer_id: nil).each do |user|
|
|
puts "Initializing Stripe Customer for user #{user.email.split('@').first}@"
|
|
user.initialize_stripe_customer
|
|
end
|
|
end
|
|
|
|
desc "Add a billing plan for all users that don't already have one"
|
|
task create_default_billing_plans: :environment do
|
|
# todo: Grab the actual promised date/time here
|
|
BETA_TESTERS_CUTOFF_DATE = "2016-11-01 08:00:00".to_time # October 1 through November 1, 2016, with 8 hours wiggle room
|
|
|
|
User.where(selected_billing_plan_id: nil).each do |user|
|
|
puts "Setting default billing plan for #{user.email.split('@').first}@"
|
|
|
|
beta_testers_plan = BillingPlan.find_by(stripe_plan_id: 'free-for-life')
|
|
standard_free_tier = BillingPlan.find_by(stripe_plan_id: 'starter')
|
|
|
|
if beta_testers_plan.nil? || standard_free_tier.nil?
|
|
raise "Couldn't find one of the necessary plans for this task -- check for free-for-life and starter stripe plan IDs"
|
|
end
|
|
|
|
if user.created_at < BETA_TESTERS_CUTOFF_DATE
|
|
# If the user was created before the free-for-life beta testers promo, give them that plan
|
|
puts "\tAdding to BETA TESTERS plan."
|
|
user.update(selected_billing_plan_id: beta_testers_plan.id)
|
|
else
|
|
# Otherwise, give the user the default free plan
|
|
puts "\tAdding to FREE TIER plan."
|
|
user.update(selected_billing_plan_id: standard_free_tier.id)
|
|
end
|
|
|
|
# Since no active subscriptions is equivalent to the free tier, there's no need to build Subscriptions for these users
|
|
end
|
|
end
|
|
|
|
desc "Add developer billing plans"
|
|
task create_developer_billing_plans: :environment do
|
|
# TODO
|
|
end
|
|
|
|
desc "Add bandwidth bonuses to billing plans"
|
|
task billing_plan_bandwidths: :environment do
|
|
puts "Updating bandwidths for all billing plans"
|
|
BillingPlan.find_by(stripe_plan_id: 'starter').update(bonus_bandwidth_kb: 50_000)
|
|
BillingPlan.find_by(stripe_plan_id: 'free-for-life').update(bonus_bandwidth_kb: 250_000)
|
|
BillingPlan.find_by(stripe_plan_id: 'early-adopters').update(bonus_bandwidth_kb: 950_000)
|
|
BillingPlan.find_by(stripe_plan_id: 'premium').update(bonus_bandwidth_kb: 950_000)
|
|
puts "Done"
|
|
end
|
|
|
|
desc "Add bandwidth counts to existing users"
|
|
task initialize_user_bandwidths: :environment do
|
|
starter_id = BillingPlan.find_by(stripe_plan_id: 'starter').id
|
|
beta_id = BillingPlan.find_by(stripe_plan_id: 'free-for-life').id
|
|
premium_ids = [
|
|
BillingPlan.find_by(stripe_plan_id: 'early-adopters').id,
|
|
BillingPlan.find_by(stripe_plan_id: 'premium').id
|
|
]
|
|
|
|
# Premium
|
|
puts "Setting premium users to 10GB"
|
|
puts User.where(selected_billing_plan_id: premium_ids).update_all(upload_bandwidth_kb: 10_000_000) # 10GB
|
|
|
|
# Starter
|
|
puts "Setting starter users to 50MB"
|
|
puts User.where(selected_billing_plan_id: nil).update_all(upload_bandwidth_kb: 50_000) # 50MB
|
|
puts User.where(selected_billing_plan_id: starter_id).update_all(upload_bandwidth_kb: 50_000) # 50MB
|
|
|
|
# Beta
|
|
puts "Setting beta users to 250MB"
|
|
puts User.where(selected_billing_plan_id: beta_id).update_all(upload_bandwidth_kb: 250_000) # 250MB
|
|
end
|
|
|
|
desc "Create default attribute categories for a bundle of users with 0 categories created"
|
|
task create_default_attribute_categories: :environment do
|
|
puts "Turning off SQL logs"
|
|
old_logger = ActiveRecord::Base.logger
|
|
ActiveRecord::Base.logger = nil
|
|
|
|
to_migrate = User.all.pluck(:id) - AttributeCategory.pluck(:user_id).uniq
|
|
|
|
users_migrated = 1
|
|
to_migrate.first(100).each do |user_id|
|
|
user = User.find(user_id)
|
|
puts "Migrating user ##{user_id} #{user.email} (#{users_migrated}/#{to_migrate.count})"
|
|
|
|
ActiveRecord::Base.transaction do
|
|
Rails.application.config.content_types[:all].each do |content_type|
|
|
puts "\tMigrating #{content_type.name}..."
|
|
content_type.create_default_attribute_categories(user)
|
|
end
|
|
end
|
|
|
|
users_migrated += 1
|
|
end
|
|
|
|
puts "Turning SQL logging back on"
|
|
ActiveRecord::Base.logger = old_logger
|
|
end
|
|
end
|