diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb index fcada856e3..463f1155ff 100644 --- a/app/controllers/admin/domain_versions_controller.rb +++ b/app/controllers/admin/domain_versions_controller.rb @@ -61,10 +61,37 @@ def show @domain = Domain.find(params[:domain_id] || params[:id]) else @version = Version::DomainVersion.find(params[:id]) - @domain = Domain.find(@version.item_id) + @domain = Domain.find_by(id: @version.item_id) + + if @domain.nil? + @domain = @version.reify + @domain_deleted = true + + # For 'create' events, reify returns nil because there's no prior state. + # Try to reconstruct from a later version or from object_changes. + if @domain.nil? + next_version = Version::DomainVersion + .where(item_id: @version.item_id) + .where.not(object: nil) + .order(created_at: :asc, id: :asc) + .first + @domain = next_version&.reify + + if @domain.nil? + @domain = Domain.new + changes = @version.object_changes || {} + changes.each do |attr, values| + value = values.is_a?(Array) ? values.last : values + @domain.send("#{attr}=", value) if @domain.respond_to?("#{attr}=") + rescue StandardError + next + end + end + end + end end - @versions = Version::DomainVersion.where(item_id: @domain.id).order(created_at: :desc, id: :desc) + @versions = Version::DomainVersion.where(item_id: @version&.item_id || @domain.id).order(created_at: :desc, id: :desc) @versions_map = @versions.all.map(&:id) get_page if params[:page].blank? diff --git a/app/views/admin/domain_versions/show.haml b/app/views/admin/domain_versions/show.haml index 364e6f0257..d0c0b8811d 100644 --- a/app/views/admin/domain_versions/show.haml +++ b/app/views/admin/domain_versions/show.haml @@ -1,10 +1,11 @@ - if @version - children = HashWithIndifferentAccess.new(@version.children) - - nameservers = Nameserver.all_versions_for(children[:nameservers], @domain.updated_at) - - dnskeys = Dnskey.all_versions_for(children[:dnskeys], @domain.updated_at) - - tech_contacts = Contact.all_versions_for(children[:tech_contacts], @domain.updated_at) - - admin_contacts = Contact.all_versions_for(children[:admin_contacts], @domain.updated_at) - - registrant = Contact.all_versions_for(children[:registrant], @domain.updated_at) + - version_timestamp = @domain.try(:updated_at) || @version.created_at + - nameservers = Nameserver.all_versions_for(children[:nameservers], version_timestamp) + - dnskeys = Dnskey.all_versions_for(children[:dnskeys], version_timestamp) + - tech_contacts = Contact.all_versions_for(children[:tech_contacts], version_timestamp) + - admin_contacts = Contact.all_versions_for(children[:admin_contacts], version_timestamp) + - registrant = Contact.all_versions_for(children[:registrant], version_timestamp) - event = @version.event - creator = plain_username(@version.terminator) - else @@ -34,18 +35,27 @@ %dl.dl-horizontal %dt= t(:name) - if !@domain.name - - domain_name = Domain.find(@version.item_id).try(:name) + - domain_name = @version.try(:object).try(:[], 'name') || 'N/A' - else - domain_name = @domain.name - %dd= link_to(domain_name, admin_domain_path(@version ? @version.item_id : @domain.id)) + - if @domain_deleted + %dd= domain_name + - else + %dd= link_to(domain_name, admin_domain_path(@version ? @version.item_id : @domain.id)) %dt= t('.created') %dd - = l(@domain.created_at, format: :short) + - if @domain.try(:created_at) + = l(@domain.created_at, format: :short) + - else + = l(@version.created_at, format: :short) %dt= t('.updated') %dd - = l(@domain.updated_at, format: :short) + - if @domain.try(:updated_at) + = l(@domain.updated_at, format: :short) + - else + = l(@version.created_at, format: :short) %br @@ -112,11 +122,20 @@ \...#{ns[:public_key].to_s[-20,20]} %br - - if @domain.registrar + - if !@domain_deleted && @domain.registrar %dt= t(:registrar_name) %dd{class: changing_css_class(@version,"registrar_id")} = link_to admin_registrar_path(@domain.registrar), target: "registrar_#{@domain.registrar.id}" do = @domain.registrar.name + - elsif @domain_deleted && @version.try(:object).try(:[], 'registrar_id') + - registrar = Registrar.find_by(id: @version.object['registrar_id']) + %dt= t(:registrar_name) + %dd{class: changing_css_class(@version,"registrar_id")} + - if registrar + = link_to admin_registrar_path(registrar), target: "registrar_#{registrar.id}" do + = registrar.name + - else + = "Registrar ID: #{@version.object['registrar_id']}" %span{:style => "margin: 20px 20px; clear:both;"} - if @version && (prev = @versions_map[(@versions_map.index(@version.id) - 1)]) && @versions_map.index(@version.id) != 0 @@ -137,8 +156,9 @@ .col-md-4 .panel.panel-default{:style => "min-height:450px;"} %ul.nav.nav-pills.nav-stacked - %li{class: ('active' if @version.nil?)} - = link_to t('.current_state'), admin_domain_version_path(current: 1, domain_id: @domain.id) + - unless @domain_deleted + %li{class: ('active' if @version.nil?)} + = link_to t('.current_state'), admin_domain_version_path(current: 1, domain_id: @domain.id) - @versions.each do |vs| %li{class: (@version && vs.id == @version.id) && :active} = link_to admin_domain_version_path(vs) do