internetee-registry/app/helpers/object_versions_helper.rb
2022-03-01 16:34:36 +02:00

57 lines
1.8 KiB
Ruby

module ObjectVersionsHelper
CSV_HEADER = ['Name', 'Registrant', 'Registrar', 'Action', 'Created at'].freeze
def attach_existing_fields(version, new_object)
version.object_changes.to_h.each do |key, value|
method_name = "#{key}=".to_sym
new_object.public_send(method_name, event_value(version, value)) if new_object.respond_to?(method_name)
end
end
def only_present_fields(version, model)
field_names = model.column_names
version.object.to_h.select { |key, _value| field_names.include?(key) }
end
def csv_generate
CSV.generate do |csv|
csv << CSV_HEADER
@versions.each do |version|
attributes = only_present_fields(version, Domain)
domain = Domain.new(attributes)
attach_existing_fields(version, domain) unless version.event == 'destroy'
csv << create_row(domain, version)
end
end
end
private
def event_value(version, val)
version.event == 'destroy' ? val.first : val.last
end
def registrant_name(domain, version)
if domain.registrant
domain.registrant.name
else
contact = Contact.all_versions_for([domain.registrant_id], version.created_at).first
if contact.nil? && ver = Version::ContactVersion.where(item_id: domain.registrant_id).last
merged_obj = ver.object_changes.to_h.each_with_object({}) {|(k,v), o| o[k] = v.last }
result = ver.object.to_h.merge(merged_obj)&.slice(*Contact&.column_names)
contact = Contact.new(result)
end
contact.try(:name) || 'Deleted'
end
end
def create_row(domain, version)
name = domain.name
registrant = registrant_name(domain, version)
registrar = domain.registrar
event = version.event
created_at = version.created_at.to_formatted_s(:db)
[name, registrant, registrar, event, created_at]
end
end