mirror of
https://github.com/internetee/registry.git
synced 2025-07-28 05:26:17 +02:00
76 lines
2.4 KiB
Ruby
76 lines
2.4 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(model, header, versions)
|
|
CSV.generate do |csv|
|
|
csv << header
|
|
versions.each do |version|
|
|
attributes = only_present_fields(version, model)
|
|
history_object = model.new(attributes)
|
|
attach_existing_fields(version, history_object) unless version.event == 'destroy'
|
|
|
|
csv << create_row(history_object, version)
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def event_value(version, val)
|
|
version.event == 'destroy' ? val.first : val.last
|
|
end
|
|
|
|
def registrant_name(domain, version)
|
|
return domain.registrant.name if domain.registrant
|
|
|
|
ver = Version::ContactVersion.where(item_id: domain.registrant_id).last
|
|
contact = Contact.all_versions_for([domain.registrant_id], version.created_at).first
|
|
|
|
if contact.nil? && ver
|
|
merged_obj = ver.object_changes.to_h.transform_values(&:last)
|
|
result = ver.object.to_h.merge(merged_obj)&.slice(*Contact&.column_names)
|
|
contact = Contact.new(result)
|
|
end
|
|
|
|
contact.try(:name) || 'Deleted'
|
|
end
|
|
|
|
def create_row(history_object, version)
|
|
if history_object.is_a?(Domain)
|
|
domain_history_row(history_object, version)
|
|
else
|
|
contact_history_row(history_object, version)
|
|
end
|
|
end
|
|
|
|
def contact_history_row(history_object, version)
|
|
name = history_object.name
|
|
code = history_object.code
|
|
ident = ident_for(history_object)
|
|
registrar = history_object.registrar
|
|
event = version.event
|
|
created_at = version.created_at.to_formatted_s(:db)
|
|
[name, code, ident, registrar, event, created_at]
|
|
end
|
|
|
|
def domain_history_row(history_object, version)
|
|
name = history_object.name
|
|
registrant = registrant_name(history_object, version)
|
|
registrar = history_object.registrar
|
|
event = version.event
|
|
created_at = version.created_at.to_formatted_s(:db)
|
|
[name, registrant, registrar, event, created_at]
|
|
end
|
|
end
|