diff --git a/app/controllers/epp/polls_controller.rb b/app/controllers/epp/polls_controller.rb index 26df210c1..531509a6c 100644 --- a/app/controllers/epp/polls_controller.rb +++ b/app/controllers/epp/polls_controller.rb @@ -11,7 +11,19 @@ class Epp::PollsController < EppController render_epp_response 'epp/poll/poll_no_messages' and return unless @message if @message.attached_obj_type && @message.attached_obj_id - @object = Object.const_get(@message.attached_obj_type).find(@message.attached_obj_id) + begin + @object = Object.const_get(@message.attached_obj_type).find(@message.attached_obj_id) + rescue => problem + # the data model might be inconsistent; or ... + # this could happen if the registrar does not dequeue messages, and then the domain was deleted + + # SELECT messages.id, domains.name, messages.body FROM messages LEFT OUTER + # JOIN domains ON attached_obj_id::INTEGER = domains.id + # WHERE attached_obj_type = 'Epp::Domain' AND name IS NULL; + + Rails.logger.error 'orphan message, error ignored: ' + problem.to_s + # now we should dequeue or delete the messages avoid duplicate log alarms + end end if @message.attached_obj_type == 'Keyrelay' diff --git a/app/models/domain.rb b/app/models/domain.rb index 0f1933144..c187403dc 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -307,14 +307,15 @@ class Domain < ActiveRecord::Base c = 0 Domain.where("statuses @> '{deleteCandidate}'::varchar[]").each do |x| Whois::Record.where('domain_id = ?', x.id).try(':destroy') - x.destroy + destroy_with_message x STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by deleteCandidate ##{x.id} (#{x.name})\n" unless Rails.env.test? + c += 1 end Domain.where('force_delete_at <= ?', Time.zone.now).each do |x| Whois::Record.where('domain_id = ?', x.id).try(':destroy') - x.destroy + destroy_with_message x STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test? c += 1 end @@ -324,6 +325,15 @@ class Domain < ActiveRecord::Base # rubocop: enable Metrics/AbcSize # rubocop:enable Rails/FindEach # rubocop: enable Metrics/LineLength + def destroy_with_message(domain) + domain.destroy + bye_bye = domain.versions.last + domain.registrar.messages.create!( + body: I18n.t(:domain_deleted), + attached_obj_id: bye_bye.id, + attached_obj_type: bye_bye.class.to_s # DomainVersion + ) + end end def name=(value) diff --git a/app/views/epp/domains/partials/_delete_complete.xml.builder b/app/views/epp/domains/partials/_delete_complete.xml.builder new file mode 100644 index 000000000..509ac6953 --- /dev/null +++ b/app/views/epp/domains/partials/_delete_complete.xml.builder @@ -0,0 +1,4 @@ +builder.tag!('domain:delData', 'xmlns:domain' => 'https://epp.tld.ee/schema/domain-eis-1.0.xsd') do + builder.tag!('domain:name', bye_bye.object['name']) + builder.tag!('domain:exDate', bye_bye.created_at) +end diff --git a/app/views/epp/poll/poll_req.xml.builder b/app/views/epp/poll/poll_req.xml.builder index 347f0a632..605ca496e 100644 --- a/app/views/epp/poll/poll_req.xml.builder +++ b/app/views/epp/poll/poll_req.xml.builder @@ -10,8 +10,11 @@ xml.epp_head do end xml.resData do - if @message.attached_obj_type == 'DomainTransfer' - xml << render('epp/domains/partials/transfer', builder: xml, dt: @object) + case @message.attached_obj_type + when 'DomainTransfer' + xml << render('epp/domains/partials/transfer', builder: xml, dt: @object) + when 'DomainVersion' + xml << render('epp/domains/partials/delete_complete', builder: xml, bye_bye: @object) end end if @object