Cada Deploy tiene un hostname único guardado en la base de datos

Con esto simplificamos la gestión de nombres de dominio, porque podemos
validar en la base de datos que solo hay uno por Deploy.

La migración recupera la información que antes guardábamos serializada
como JSON en la base de datos.
This commit is contained in:
f 2021-08-01 21:48:49 -03:00
parent 3e0b94fbce
commit 7cfd55e126

View file

@ -0,0 +1,56 @@
# 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
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.
Deploy.where(site_id: nil).destroy_all
add_column :deploys, :hostname_tmp, :string
Site.find_each do |site|
site.deploys.find_each do |deploy|
deploy.hostname_tmp = deploy.values[:hostname] || deploy.values[:onion] || deploy.hostname
end
end
rename_column :deploys, :hostname_tmp, :hostname
remove_column :deploys, :values
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