# frozen_string_literal: true # Recupera la funcionalidad que estamos deprecando. module AddValuesToDeploy extend ActiveSupport::Concern included do store :values, accessors: %i[hostname onion], coder: JSON puts 'XXX: Al incluir este módulo todas las migraciones siguientes van a fallar. Podés correrlas de nuevo para arreglarlas.' end end # Convertir todos los valores serializados de Deploy en una columna, # porque al final el único uso que tuvo fue para guardar los hostnames # alternativos. # # ¡El hostname es único para poder evitar que haya duplicados! class AddHostnameToDeploys < ActiveRecord::Migration[6.1] # Crea una columna temporal y guarda todos los valores. Los traspasa # y luego elimina la columna. def up Deploy.include AddValuesToDeploy # Ya que estamos hacer limpieza, eliminando deploys sin sitios Deploy.where(site_id: nil).delete_all Deploy.where.not(site_id: Site.all.pluck(:id)).delete_all add_column :deploys, :hostname_tmp, :string Site.find_each do |site| # Temporalmente cambiar el nombre del sitio para que los hostnames # se generen bien, pero los cambios de nombre reales los vamos a # hacer manualmente. site.name = site.name.split('.', 2).first if site.name.include?('.') site.deploys.find_each do |deploy| hostname = (deploy.values[:onion] || deploy.values[:hostname] || deploy.hostname || "#{SecureRandom.hex}.invalid").dup.sub( /\.\z/, '' ) deploy.update_columns hostname_tmp: hostname end end rename_column :deploys, :hostname_tmp, :hostname remove_column :deploys, :values # Eliminar los dominios duplicados para un mismo sitio, siempre # y cuando no sean DeployLocal. columns = %i[site_id hostname] Deploy.group(*columns).pluck(*columns).each do |duplicated| deploys = Deploy.where(columns.zip(duplicated).to_h).order(:created_at).pluck(:id, :type) next unless deploys.size > 1 Deploy.where(id: deploys.reject { |d| d.last == 'DeployLocal' }.map(&:first)).delete_all end add_index :deploys, :hostname, unique: true # A esta altura todos los dominios deberían estar migrados. change_column :deploys, :hostname, :string, null: false end # Recupera los valores desde la columna creada. def down Deploy.include AddValuesToDeploy rename_column :deploys, :hostname, :hostname_tmp add_column :deploys, :values, :text Site.find_each do |site| site.deploys.find_each do |deploy| deploy.values[(deploy.is_a? DeployHiddenService ? :onion : :hostname)] = deploy.hostname_tmp end end remove_column :deploys, :hostname_tmp end end