class LoggableActivity::Services::UpdatePayloadsBuilder
This service class builds update payloads when an instance of a model is updated.
Public Instance Methods
build()
click to toggle source
Builds payloads for a ::LoggableActivity::Activity
.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 8 def build build_primary_update_payload build_relations_update_payloads @payloads end
Private Instance Methods
build_belongs_to_update_payload(relation_config)
click to toggle source
Builds the update payload for a belongs_to relation.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 52 def build_belongs_to_update_payload(relation_config) relation_id = "#{relation_config['belongs_to']}_id" model_class_name = relation_config['model'] model_class = model_class_name.constantize data_owner = relation_config['data_owner'] model_ids = saved_changes(@record).map { |hash| hash[relation_id] } model_ids.each_with_index do |id, index| record = id ? model_class.find_by(id:) : nil next unless record options = { related_to_activity_as: 'belongs_to_update_payload', current_payload: index == 1, data_owner: } build_encrypted_payload(record, options) end end
build_encrypted_update_payload(record, current_values, previous_values, options = {})
click to toggle source
Builds the encrypted update payload for a record.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 150 def build_encrypted_update_payload(record, current_values, previous_values, options = {}) encryption_key = ::LoggableActivity::EncryptionKey.for_record(record) encrypted_attrs = encrypted_update_attrs( current_values, previous_values, encryption_key.secret_key ) build_payload( record, encryption_key, encrypted_attrs, options ) end
build_has_many_create_payload(relation_config, record)
click to toggle source
# File lib/loggable_activity/services/update_payloads_builder.rb, line 106 def build_has_many_create_payload(relation_config, record) record.disable_hooks = true data_owner = relation_config['data_owner'] options = { related_to_activity_as: 'has_many_create_payload', current_payload: true, data_owner: } build_encrypted_payload(record, options) end
build_has_many_update_payload(relation_config, record)
click to toggle source
# File lib/loggable_activity/services/update_payloads_builder.rb, line 88 def build_has_many_update_payload(relation_config, record) record.disable_hooks = true previous_values, current_values = changes_to_save(record) loggable_attrs = relation_config['loggable_attrs'] return if previous_values == current_values previous_values = previous_values.slice(*loggable_attrs) data_owner = relation_config['data_owner'] options = { related_to_activity_as: 'has_many_update_payload', current_payload: true, data_owner: } build_encrypted_update_payload( record, current_values, previous_values, options ) end
build_has_many_update_payloads(relation_config)
click to toggle source
Builds payloads for has_many relations.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 72 def build_has_many_update_payloads(relation_config) relation = (relation_config['has_many']).to_s records = @record.send(relation) return nil if records.empty? records.each do |record| if record.persisted? && record.changes_to_save.any? build_has_many_update_payload(relation_config, record) elsif record.persisted? && record.saved_changes.any? # "no changes to save" else build_has_many_create_payload(relation_config, record) end end end
build_has_one_update_payload(relation_config)
click to toggle source
Builds the update payload for a has_one relation.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 115 def build_has_one_update_payload(relation_config) relation = (relation_config['has_one']).to_s record = @record.send(relation) return nil if record.nil? previous_values, current_values = changes_to_save(record) loggable_attrs = record.class.loggable_attrs return if previous_values == current_values previous_values = previous_values.slice(*loggable_attrs) data_owner = relation_config['data_owner'] options = { related_to_activity_as: 'has_one_update_payload', current_payload: true, data_owner: } build_encrypted_update_payload( record, current_values, previous_values, options ) end
build_primary_update_payload()
click to toggle source
Builds the primary payload.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 17 def build_primary_update_payload previous_values, current_values = saved_changes(@record) previous_values.slice(*@loggable_attrs) options = { related_to_activity_as: 'primary_update_payload', current_payload: true, data_owner: true } build_encrypted_update_payload( @record, current_values, previous_values, options ) end
build_relation_update_payload(relation_config)
click to toggle source
# File lib/loggable_activity/services/update_payloads_builder.rb, line 38 def build_relation_update_payload(relation_config) relation_config.each_key do |key| case key when 'belongs_to' build_belongs_to_update_payload(relation_config) when 'has_one' build_has_one_update_payload(relation_config) when 'has_many' build_has_many_update_payloads(relation_config) end end end
build_relations_update_payloads()
click to toggle source
Build the payloads for the relations of the record. only relations included in the configuration, will be logged.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 32 def build_relations_update_payloads @relations.each do |relation_config| build_relation_update_payload(relation_config) end end
encrypted_update_attrs(current_values, previous_values, encryption_key)
click to toggle source
Returns the encrypted attributes for the update payload.
# File lib/loggable_activity/services/update_payloads_builder.rb, line 137 def encrypted_update_attrs(current_values, previous_values, encryption_key) changes = [] previous_values.each do |key, from_value| from = ::LoggableActivity::Encryption.encrypt(from_value, encryption_key) to_value = current_values[key] to = ::LoggableActivity::Encryption.encrypt(to_value, encryption_key) changes << { key => { from:, to: } } end { changes: } end