# frozen_string_literal: true

class AddTokenHashToEmailToken < ActiveRecord::Migration[6.1]
  def up
    add_column :email_tokens, :token_hash, :string

    loop do
      rows =
        DB
          .query("SELECT id, token FROM email_tokens WHERE token_hash IS NULL LIMIT 500")
          .map { |row| { id: row.id, token_hash: Digest::SHA256.hexdigest(row.token) } }

      break if rows.size == 0

      data_string = rows.map { |r| "(#{r[:id]}, '#{r[:token_hash]}')" }.join(",")
      execute <<~SQL
        UPDATE email_tokens
        SET token_hash = data.token_hash
        FROM (VALUES #{data_string}) AS data(id, token_hash)
        WHERE email_tokens.id = data.id
      SQL
    end

    change_column_null :email_tokens, :token_hash, false
  end

  def down
    drop_column :email_tokens, :token_hash, :string
  end
end
