# frozen_string_literal: true
class AddUuidToServer < ActiveRecord::Migration[6.1]
# All of this just so uuid would be closer to the front...
#
# !!!!!IMPORTANT!!!!!
#
# Doing this type of migration will RESET the PK's auto-increment counter back to 0 on the new table
# It MUST be set back to the highest number manually using this SQL:
#
# ALTER SEQUENCE <table_name>_id_seq RESTART WITH <count>;
#
# Failure to do so will result in broken functionality that may or may not be apparent at the time.
#
def change
# Delete old foreign keys
remove_foreign_key :logs, :servers
remove_foreign_key :servers, :communities
remove_foreign_key :server_mods, :servers
remove_foreign_key :server_rewards, :servers
remove_foreign_key :server_settings, :servers
remove_foreign_key :territories, :servers
remove_foreign_key :user_gamble_stats, :servers
remove_foreign_key :user_notification_preferences, :servers
remove_foreign_key :user_notification_routes, :servers, column: :source_server_id
# Rename old table
rename_table(:servers, :servers_old)
# Recreate the table with the changes
# Dropped :deleted_at
# Added :uuid
# Added :server_visibility
# Added :server_version
create_table :servers do |t|
t.uuid :uuid, null: false
t.string :server_id, null: false
t.integer :community_id, null: false
t.text :server_key, null: true
t.text :server_name
t.integer :server_visibility, null: false, default: 1
t.string :server_ip
t.string :server_port
t.string :server_version
t.datetime :server_start_time
t.datetime :disconnected_at
t.timestamps
end
# Migrate the old data over to the new table
ESM::Server.reset_column_information
data = execute("SELECT * FROM servers_old;")
data.each do |server|
server["uuid"] = SecureRandom.uuid
ESM::Server.create!(server.except("deleted_at"))
end
# Delete old table
drop_table(:servers_old)
# Recreate the indexes
add_index :servers, :uuid, unique: true
add_index :servers, :server_id, unique: true
add_index :servers, :server_key, unique: true
# Recreate the foreign keys
add_foreign_key :logs, :servers
add_foreign_key :servers, :communities
add_foreign_key :server_mods, :servers
add_foreign_key :server_rewards, :servers
add_foreign_key :server_settings, :servers
add_foreign_key :territories, :servers
add_foreign_key :user_gamble_stats, :servers
add_foreign_key :user_notification_preferences, :servers
end
end