diff --git a/app/jobs/whois_sync_job.rb b/app/jobs/whois_sync_job.rb new file mode 100644 index 0000000..45ecceb --- /dev/null +++ b/app/jobs/whois_sync_job.rb @@ -0,0 +1,27 @@ +class WhoisSyncJob < ApplicationJob + queue_as :default + + rescue_from ActiveRecord::RecordNotFound do; end + + attr_reader :check + + def perform(check_id) + @check = Check.find(check_id) + response = Whois.ask(check.domain) + + return unless response.valid? + + update_from_response(response) + + check.save! + rescue Whois::DomainNotFoundError + check.active = false + check.save! + end + + def update_from_response(response) + check.domain_created_at = response.created_at + check.domain_updated_at = response.updated_at + check.domain_expire_at = response.expire_at + end +end diff --git a/app/models/check.rb b/app/models/check.rb index f3bbbd4..f9be2f1 100644 --- a/app/models/check.rb +++ b/app/models/check.rb @@ -45,6 +45,8 @@ class Check < ApplicationRecord validates :comment, length: { maximum: 255 } validates :vendor, length: { maximum: 255 } + after_save :enqueue_sync + protected def domain_created_at_past @@ -54,4 +56,11 @@ class Check < ApplicationRecord def domain_updated_at_past errors.add(:domain_updated_at, :past) if domain_updated_at.present? && domain_updated_at.future? end + + def enqueue_sync + return unless active? + return unless saved_changes.key?("domain") + + WhoisSyncJob.perform_later(id) if domain? + end end diff --git a/app/services/whois.rb b/app/services/whois.rb index 8ab3599..68c9b27 100644 --- a/app/services/whois.rb +++ b/app/services/whois.rb @@ -8,7 +8,7 @@ require_relative "whois/errors" module Whois class << self def ask(domain, system_klass: SystemCommand, logger: NullLogger.new) - Service.new(domain, system_klass, logger: logger).call + Service.new(domain, system_klass: system_klass, logger: logger).call end end diff --git a/config/environments/development.rb b/config/environments/development.rb index 1888e36..0c7f9d2 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -67,4 +67,6 @@ Rails.application.configure do # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. config.file_watcher = ActiveSupport::EventedFileUpdateChecker + + config.active_job.queue_adapter = :inline end diff --git a/test/jobs/whois_sync_job_test.rb b/test/jobs/whois_sync_job_test.rb new file mode 100644 index 0000000..56c5ee4 --- /dev/null +++ b/test/jobs/whois_sync_job_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class WhoisSyncJobTest < ActiveJob::TestCase + # test "the truth" do + # assert true + # end +end