diff --git a/app/controllers/admin/registrars_controller.rb b/app/controllers/admin/registrars_controller.rb index ed9955518..5448ced2e 100644 --- a/app/controllers/admin/registrars_controller.rb +++ b/app/controllers/admin/registrars_controller.rb @@ -6,7 +6,7 @@ class Admin::RegistrarsController < AdminController end def index - @q = Registrar.search(params[:q]) + @q = Registrar.ordered.search(params[:q]) @registrars = @q.result.page(params[:page]) end diff --git a/app/models/registrar.rb b/app/models/registrar.rb index ea36daef5..a2dbf4385 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -8,6 +8,7 @@ class Registrar < ActiveRecord::Base has_many :invoices, foreign_key: 'buyer_id' has_many :accounts has_many :nameservers, through: :domains + has_many :whois_records belongs_to :country_deprecated, foreign_key: :country_id @@ -39,6 +40,15 @@ class Registrar < ActiveRecord::Base validates :email, :billing_email, format: /@/, allow_blank: true + WHOIS_TRIGGERS = %w(name email phone street city state zip) + + after_save :update_whois_records + def update_whois_records + if changed? && (changes.keys & WHOIS_TRIGGERS).present? + whois_records.map(&:save) # slow currently + end + end + class << self def search_by_query(query) res = search(name_or_reg_no_cont: query).result @@ -48,6 +58,11 @@ class Registrar < ActiveRecord::Base def eis find_by(reg_no: '90010019') end + + def ordered + order(name: :asc) + end + end def issue_prepayment_invoice(amount, description = nil) # rubocop:disable Metrics/MethodLength diff --git a/app/models/whois_record.rb b/app/models/whois_record.rb index d8384edfd..e1a0f124b 100644 --- a/app/models/whois_record.rb +++ b/app/models/whois_record.rb @@ -5,10 +5,25 @@ class WhoisRecord < ActiveRecord::Base before_validation :populate def populate - return if domain.blank? + return if domain_id.blank? self.json = generate_json - self.name = json['name'] self.body = generated_body + self.name = json['name'] + self.registrar_id = domain.registrar_id # for faster registrar updates + end + + class << self + def included + includes( + domain: [ + :registrant, + :registrar, + :nameservers, + { tech_contacts: :registrar }, + { admin_contacts: :registrar } + ] + ) + end end # rubocop:disable Metrics/MethodLength @@ -24,10 +39,12 @@ class WhoisRecord < ActiveRecord::Base h[:updated_at] = domain.updated_at.try(:to_s, :iso8601) h[:valid_to] = domain.valid_to.try(:to_s, :iso8601) + # update registar triggers when adding new attributes h[:registrar] = domain.registrar.name h[:registrar_phone] = domain.registrar.phone h[:registrar_address] = domain.registrar.address h[:registrar_update_at] = domain.registrar.updated_at.try(:to_s, :iso8601) + h[:admin_contacts] = [] domain.admin_contacts.each do |ac| @disclosed << [:email, ac.email] diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb new file mode 100644 index 000000000..2eeb4bab6 --- /dev/null +++ b/config/initializers/kaminari_config.rb @@ -0,0 +1,10 @@ +Kaminari.configure do |config| + config.default_per_page = 75 + # config.max_per_page = nil + # config.window = 4 + # config.outer_window = 0 + # config.left = 0 + # config.right = 0 + # config.page_method_name = :page + # config.param_name = :page +end diff --git a/db/migrate/20150430121807_add_registrar_id_to_whois_record.rb b/db/migrate/20150430121807_add_registrar_id_to_whois_record.rb new file mode 100644 index 000000000..c9551ca9e --- /dev/null +++ b/db/migrate/20150430121807_add_registrar_id_to_whois_record.rb @@ -0,0 +1,6 @@ +class AddRegistrarIdToWhoisRecord < ActiveRecord::Migration + def change + add_column :whois_records, :registrar_id, :integer + add_index :whois_records, :registrar_id + end +end diff --git a/db/schema.rb b/db/schema.rb index d30dece39..86e8b4017 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150429135339) do +ActiveRecord::Schema.define(version: 20150430121807) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -917,11 +917,13 @@ ActiveRecord::Schema.define(version: 20150429135339) do t.string "name" t.text "body" t.json "json" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "registrar_id" end add_index "whois_records", ["domain_id"], name: "index_whois_records_on_domain_id", using: :btree + add_index "whois_records", ["registrar_id"], name: "index_whois_records_on_registrar_id", using: :btree create_table "zonefile_settings", force: :cascade do |t| t.string "origin" diff --git a/lib/tasks/whois.rake b/lib/tasks/whois.rake index 9a62dee9a..293a34d2d 100644 --- a/lib/tasks/whois.rake +++ b/lib/tasks/whois.rake @@ -1,19 +1,25 @@ namespace :whois do - desc 'Regenerate whois records at Registry master database (slow)' + desc 'Regenerate Registry whois_records table and sync with whois server (slower)' task regenerate: :environment do start = Time.zone.now.to_f - print "-----> Regenerate whois records at Registry master database..." - Domain.included.find_each(batch_size: 50000).with_index do |d, index| - d.update_whois_record - print '.' if index % 100 == 0 + + @i = 0 + print "-----> Regenerate Registry whois_records table and sync with whois server..." + ActiveRecord::Base.uncached do + puts "\n#{@i}" + Domain.included.find_in_batches(batch_size: 10000) do |batch| + batch.map { |d| d.update_whois_record } + puts(@i += 10000) + GC.start + end end puts "\n-----> all done in #{(Time.zone.now.to_f - start).round(2)} seconds" end - desc 'Delete whois database data and sync with Registry master database (fast)' + desc 'Delete whois database data and import from Registry master database (faster)' task export: :environment do start = Time.zone.now.to_f - print "-----> Delete whois database data and sync with Registry master database..." + print "-----> Delete whois database data and import from Registry whois_records table..." whois_records = WhoisRecord.pluck(:name, :body, :json) Whois::Record.delete_all Whois::Record.import([:name, :body, :json], whois_records) @@ -37,18 +43,5 @@ namespace :whois do puts "\n#{e}" end end - - desc 'Force whois schema into exsisting whois database' - task force_load: [:environment] do - whois_db = "whois_#{Rails.env}" - begin - puts "\n------------------------ #{whois_db} schema loading ------------------------------\n" - ActiveRecord::Base.clear_all_connections! - ActiveRecord::Base.establish_connection(whois_db.to_sym) - load("#{Rails.root}/db/#{schema_file(whois_db)}") - rescue => e - puts "\n#{e}" - end - end end end diff --git a/spec/models/whois_record_spec.rb b/spec/models/whois_record_spec.rb index 964603d95..7e89984d1 100644 --- a/spec/models/whois_record_spec.rb +++ b/spec/models/whois_record_spec.rb @@ -23,6 +23,10 @@ describe WhoisRecord do it 'should not have whois body' do @whois_record.body.should == nil end + + it 'should not have registrar' do + @whois_record.registrar.should == nil + end end context 'with valid attributes' do @@ -41,6 +45,10 @@ describe WhoisRecord do @whois_record.errors.full_messages.should match_array([]) end + it 'should have registrar' do + @whois_record.registrar.present?.should == true + end + it 'should have whois body by default' do @whois_record.body.present?.should == true end