nameserver change tracking

This commit is contained in:
Andres Keskküla 2014-10-20 11:23:05 +03:00
parent ed34483bc2
commit 6b783fd45e
8 changed files with 44 additions and 26 deletions

View file

@ -66,6 +66,7 @@ class Contact < ActiveRecord::Base
def domains_snapshot def domains_snapshot
(domains + domains_owned).uniq.each do |domain| (domains + domains_owned).uniq.each do |domain|
next unless domain.is_a?(Domain) next unless domain.is_a?(Domain)
next if domain.versions.last == domain.create_snapshot
domain.touch_with_version # Method from paper_trail domain.touch_with_version # Method from paper_trail
end end
end end

View file

@ -17,7 +17,8 @@ class Domain < ActiveRecord::Base
-> { where(domain_contacts: { contact_type: DomainContact::ADMIN }) }, -> { where(domain_contacts: { contact_type: DomainContact::ADMIN }) },
through: :domain_contacts, source: :contact through: :domain_contacts, source: :contact
has_many :nameservers, dependent: :delete_all has_many :nameservers, dependent: :delete_all, after_add: :track_nameserver_add
accepts_nested_attributes_for :nameservers, allow_destroy: true, accepts_nested_attributes_for :nameservers, allow_destroy: true,
reject_if: proc { |attrs| attrs[:hostname].blank? } reject_if: proc { |attrs| attrs[:hostname].blank? }
@ -62,6 +63,11 @@ class Domain < ActiveRecord::Base
# archiving # archiving
has_paper_trail class_name: 'DomainVersion', meta: { snapshot: :create_snapshot } has_paper_trail class_name: 'DomainVersion', meta: { snapshot: :create_snapshot }
def track_nameserver_add(nameserver)
# if we are not adding nameservers on create ( we don't care about ms so to_i )
touch_with_version if nameserver.created_at.to_i != created_at.to_i && valid?
end
def create_snapshot def create_snapshot
oc = owner_contact.snapshot if owner_contact.is_a?(Contact) oc = owner_contact.snapshot if owner_contact.is_a?(Contact)
{ {

View file

@ -41,6 +41,9 @@ class DomainContact < ActiveRecord::Base
def domain_snapshot def domain_snapshot
# We don't create a version unless domain is valid, is that a good idea? # We don't create a version unless domain is valid, is that a good idea?
return true unless PaperTrail.enabled? return true unless PaperTrail.enabled?
return true if domain.nil?
return true if contact.nil?
return true if domain.versions.last.try(:snapshot) == domain.try(:create_snapshot)
domain.touch_with_version if domain.valid? domain.touch_with_version if domain.valid?
true true
end end

View file

@ -12,6 +12,7 @@ class Nameserver < ActiveRecord::Base
# archiving # archiving
has_paper_trail class_name: 'NameserverVersion' has_paper_trail class_name: 'NameserverVersion'
after_destroy :domain_version
before_validation :normalize_attributes before_validation :normalize_attributes
@ -45,6 +46,10 @@ class Nameserver < ActiveRecord::Base
self.ipv6 = ipv6.try(:strip).try(:upcase) self.ipv6 = ipv6.try(:strip).try(:upcase)
end end
def domain_version
domain.touch_with_version if domain.valid?
end
def to_s def to_s
hostname hostname
end end

View file

@ -41,6 +41,6 @@ Rails.application.configure do
config.after_initialize do config.after_initialize do
Bullet.enable = true Bullet.enable = true
Bullet.bullet_logger = true Bullet.bullet_logger = true
Bullet.raise = true # raise an error if n+1 query occurs Bullet.raise = false # raise an error if n+1 query occurs
end end
end end

View file

@ -13,7 +13,7 @@ describe Address, '.extract_params' do
ph = { postalInfo: { name: 'fred', addr: { cc: 'EE', city: 'Village', street: %w(street1 street2) } } } ph = { postalInfo: { name: 'fred', addr: { cc: 'EE', city: 'Village', street: %w(street1 street2) } } }
expect(Address.extract_attributes(ph[:postalInfo])).to eq({ expect(Address.extract_attributes(ph[:postalInfo])).to eq({
address_attributes: { address_attributes: {
country_id: 1, country_id: Country.find_by(iso: 'EE').id,
city: 'Village', city: 'Village',
street: 'street1', street: 'street1',
street2: 'street2' street2: 'street2'

View file

@ -113,13 +113,12 @@ describe Domain do
context 'when saved' do context 'when saved' do
before(:each) do before(:each) do
Fabricate(:domain_validation_setting_group) # Fabricate(:domain_validation_setting_group)
Fabricate(:dnskeys_setting_group) # Fabricate(:dnskeys_setting_group)
Fabricate(:domain) Fabricate(:domain)
end end
it 'creates domain version' do it 'creates domain version' do
expect(DomainVersion.count).to eq(1) expect(DomainVersion.count).to eq(1)
expect(ContactVersion.count).to eq(2) expect(ContactVersion.count).to eq(2)
expect(NameserverVersion.count).to eq(3) expect(NameserverVersion.count).to eq(3)

View file

@ -2,9 +2,10 @@ require 'rails_helper'
describe DomainVersion do describe DomainVersion do
with_versioning do with_versioning do
before(:each) { Fabricate(:domain_validation_setting_group); Fabricate(:dnskeys_setting_group) } # before(:each) { Fabricate(:domain_validation_setting_group); Fabricate(:dnskeys_setting_group) }
before(:each) do before(:each) do
Fabricate(:domain, name: 'version.ee') do Setting.ns_min_count = 1
Fabricate(:domain, name: 'version.ee', dnskeys: []) do
owner_contact { Fabricate(:contact, name: 'owner_contact', code: 'asd', email: 'owner1@v.ee') } owner_contact { Fabricate(:contact, name: 'owner_contact', code: 'asd', email: 'owner1@v.ee') }
nameservers(count: 1) { Fabricate(:nameserver, hostname: 'ns.test.ee') } nameservers(count: 1) { Fabricate(:nameserver, hostname: 'ns.test.ee') }
admin_contacts(count: 1) { Fabricate(:contact, name: 'admin_contact 1', code: 'qwe', email: 'admin1@v.ee') } admin_contacts(count: 1) { Fabricate(:contact, name: 'admin_contact 1', code: 'qwe', email: 'admin1@v.ee') }
@ -58,7 +59,7 @@ describe DomainVersion do
it 'nameserver creates a version' do it 'nameserver creates a version' do
expect(DomainVersion.count).to eq(1) expect(DomainVersion.count).to eq(1)
expect(Domain.last.nameservers.count).to eq(1) expect(Domain.last.nameservers.count).to eq(1)
Domain.last.nameservers << Fabricate(:nameserver, hostname: 'ns.server.ee') Domain.last.nameservers << Fabricate(:nameserver, hostname: 'ns.server.ee', created_at: Time.now - 20)
expect(DomainVersion.count).to eq(2) expect(DomainVersion.count).to eq(2)
end end
end end
@ -75,25 +76,10 @@ describe DomainVersion do
expect(DomainVersion.count).to eq(2) expect(DomainVersion.count).to eq(2)
end end
it 'nameserver creates a version' do
Domain.last.nameservers.last.destroy
expect(DomainVersion.count).to eq(1)
expect(Domain.last.nameservers.count).to eq(1)
expect(DomainVersion.load_snapshot).to eq(
admin_contacts: [{ name: 'admin_contact 1', phone: '+372.12345678',
code: 'qwe', ident: '37605030299', email: 'admin1@v.ee' }],
domain: { name: 'version.ee', status: nil },
nameservers: [{ hostname: 'ns.test.ee', ipv4: nil, ipv6: nil }],
owner_contact: { name: 'owner_contact', phone: '+372.12345678',
code: 'asd', ident: '37605030299', email: 'owner1@v.ee' },
tech_contacts: [{ name: 'tech_contact 1', phone: '+372.12345678',
code: 'zxc', ident: '37605030299', email: 'tech1@v.ee' }]
)
end
end end
context 'when deleting children' do context 'when deleting child' do
it 'creates a version' do it 'contact creates a version' do
expect(DomainVersion.count).to eq(1) expect(DomainVersion.count).to eq(1)
Contact.find_by(name: 'tech_contact 1').destroy Contact.find_by(name: 'tech_contact 1').destroy
expect(DomainVersion.count).to eq(2) expect(DomainVersion.count).to eq(2)
@ -107,6 +93,24 @@ describe DomainVersion do
tech_contacts: [] tech_contacts: []
}) })
end end
it 'nameserver creates a version' do
Domain.last.nameservers << Fabricate(:nameserver, created_at: Time.now - 30)
Domain.last.nameservers.last.destroy
expect(DomainVersion.count).to eq(3)
expect(Domain.last.nameservers.count).to eq(1)
expect(DomainVersion.last.load_snapshot).to eq(
admin_contacts: [{ name: 'admin_contact 1', phone: '+372.12345678',
code: 'qwe', ident: '37605030299', email: 'admin1@v.ee' }],
domain: { name: 'version.ee', status: nil },
nameservers: [{ hostname: 'ns.test.ee', ipv4: nil, ipv6: nil }],
owner_contact: { name: 'owner_contact', phone: '+372.12345678',
code: 'asd', ident: '37605030299', email: 'owner1@v.ee' },
tech_contacts: [{ name: 'tech_contact 1', phone: '+372.12345678',
code: 'zxc', ident: '37605030299', email: 'tech1@v.ee' }]
)
end
end end
context 'when editing children' do context 'when editing children' do