From d41488472aba158797810a9c9f6ac866d4433c67 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Fri, 11 Dec 2015 17:43:20 +0200 Subject: [PATCH] Story#108521790 - import dnskey history --- app/models/dnskey.rb | 4 ++ app/models/legacy/dnskey.rb | 2 + app/models/legacy/dnskey_history.rb | 8 ++++ lib/tasks/import_history.rake | 66 +++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 app/models/legacy/dnskey_history.rb diff --git a/app/models/dnskey.rb b/app/models/dnskey.rb index 02b43d729..ef8f68a39 100644 --- a/app/models/dnskey.rb +++ b/app/models/dnskey.rb @@ -120,5 +120,9 @@ class Dnskey < ActiveRecord::Base def bin_to_hex(s) s.each_byte.map { |b| format('%02X', b) }.join end + + def next_id + self.connection.select_value("SELECT nextval('#{self.sequence_name}')") + end end end diff --git a/app/models/legacy/dnskey.rb b/app/models/legacy/dnskey.rb index 3fa47f48b..782673ef8 100644 --- a/app/models/legacy/dnskey.rb +++ b/app/models/legacy/dnskey.rb @@ -1,8 +1,10 @@ module Legacy class Dnskey < Db self.table_name = :dnskey + self.primary_key = :id belongs_to :object_registry, foreign_key: :id belongs_to :object, foreign_key: :id + has_one :object_history, foreign_key: :historyid, primary_key: :historyid end end diff --git a/app/models/legacy/dnskey_history.rb b/app/models/legacy/dnskey_history.rb new file mode 100644 index 000000000..1f62b1002 --- /dev/null +++ b/app/models/legacy/dnskey_history.rb @@ -0,0 +1,8 @@ +module Legacy + class DnskeyHistory < Db + self.table_name = :dnskey_history + + belongs_to :object_registry, foreign_key: :id + belongs_to :object, foreign_key: :id + end +end diff --git a/lib/tasks/import_history.rake b/lib/tasks/import_history.rake index 1948e1b88..b982492cb 100644 --- a/lib/tasks/import_history.rake +++ b/lib/tasks/import_history.rake @@ -1,4 +1,12 @@ namespace :import do + desc 'Import all history' + task history_all: :environment do + Rake::Task['import:history_contacts'].invoke + Rake::Task['import:history_dnskeys'].invoke + Rake::Task['import:history_domains'].invoke + end + + desc 'Import contact history' task history_contacts: :environment do Legacy::ContactHistory.uniq.pluck(:id).each do |legacy_contact_id| @@ -70,6 +78,64 @@ namespace :import do end + desc 'Import contact history' + task history_dnskeys: :environment do + Legacy::DnskeyHistory.uniq.pluck(:id).each do |legacy_dnskey_id| + Dnskey.transaction do + contact = Dnskey.find_by(legacy_id: legacy_dnskey_id) + version_dns = DnskeytVersion.where("object->>'legacy_id' = '#{legacy_dnskey_id}'").select(:item_id).first + contact ||= Dnskey.new(id: version_dns.item_id, legacy_id: legacy_dnskey_id) if version_dns + contact ||= Dnskey.new(id: ::Contact.next_id, legacy_id: legacy_dnskey_id) + next if contact.versions.where(event: :create).any? + # add here to skip domains whith create history + + last_changes = nil + history = Legacy::ContactHistory.changes_dates_for(legacy_dnskey_id) + last_contact_action = history.sort.last[1].last # need to identify if we delete + + keys = history.keys.compact.sort + i = 0 + keys.each_with_index do |time| + history[time].each do |orig_history_klass| + changes = {} + responder = orig_history_klass[:klass].get_record_at(legacy_dnskey_id, orig_history_klass[:id]) + new_attrs = responder.get_current_contact_object(time, orig_history_klass[:param]) + new_attrs[:id] = contact.id + + event = :update + event = :create if i == 0 + if orig_history_klass == last_contact_action && responder.valid_to.present? + event = :destroy + new_attrs = {} + end + + new_attrs.each do |k, v| + if (old_val = last_changes.to_h[k]) != v then changes[k] = [old_val, v] end + end + next if changes.blank? && event != :destroy + obj_his = Legacy::ObjectHistory.find_by(historyid: responder.historyid) + user = Registrar.find_by(legacy_id: obj_his.upid || obj_his.clid).try(:api_users).try(:first) + + hash = { + item_type: Dnskey.to_s, + item_id: contact.id, + event: event, + whodunnit: user.try(:id), + object: last_changes, + object_changes: changes, + created_at: time + } + DnskeyVersion.create!(hash) + + last_changes = new_attrs + i += 1 + end + end + end + end + end + + desc 'Import domain history' task history_domains: :environment do Domain.transaction do