From e3a9d1c9b87b83096877a9682fe5f81042ed00bb Mon Sep 17 00:00:00 2001 From: mohammednasser-32 Date: Mon, 21 Oct 2024 20:39:30 +0300 Subject: [PATCH 1/3] allow calling audited multiple times --- lib/audited/auditor.rb | 38 +++++++++++++++++++++++----- spec/audited/auditor_spec.rb | 16 ++++++++++++ spec/support/active_record/models.rb | 6 +++++ 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/lib/audited/auditor.rb b/lib/audited/auditor.rb index c9c867ae..ae43fdb4 100644 --- a/lib/audited/auditor.rb +++ b/lib/audited/auditor.rb @@ -59,9 +59,16 @@ module ClassMethods # end # def audited(options = {}) - # don't allow multiple calls - return if included_modules.include?(Audited::Auditor::AuditedInstanceMethods) + audited? ? update_audited_options(options) : set_audit(options) + end + + private + + def audited? + included_modules.include?(Audited::Auditor::AuditedInstanceMethods) + end + def set_audit(options) extend Audited::Auditor::AuditedClassMethods include Audited::Auditor::AuditedInstanceMethods @@ -69,10 +76,7 @@ def audited(options = {}) class_attribute :audited_options, instance_writer: false attr_accessor :audit_version, :audit_comment - self.audited_options = options - normalize_audited_options - - self.audit_associated_with = audited_options[:associated_with] + set_audited_options(options) if audited_options[:comment_required] validate :presence_of_audit_comment @@ -100,6 +104,23 @@ def audited(options = {}) def has_associated_audits has_many :associated_audits, as: :associated, class_name: Audited.audit_class.name end + + def update_audited_options(new_options) + previous_audit_options = self.audited_options + set_audited_options(new_options) + self.reset_audited_columns + + log_message = "#{self.name} is already audited, audit options will be updated\n"\ + "before: #{previous_audit_options}\n"\ + "after: #{self.audited_options}" + Logger.new($stdout).info(log_message) + end + + def set_audited_options(options) + self.audited_options = options + normalize_audited_options + self.audit_associated_with = audited_options[:associated_with] + end end module AuditedInstanceMethods @@ -530,6 +551,11 @@ def calculate_non_audited_columns def class_auditing_enabled Audited.store.fetch("#{table_name}_auditing_enabled", true) end + + def reset_audited_columns + @audited_columns = nil + @non_audited_columns = nil + end end end end diff --git a/spec/audited/auditor_spec.rb b/spec/audited/auditor_spec.rb index cff4044b..15ff2f77 100644 --- a/spec/audited/auditor_spec.rb +++ b/spec/audited/auditor_spec.rb @@ -1270,4 +1270,20 @@ def stub_global_max_audits(max_audits) }.to_not change(Audited::Audit, :count) end end + + describe "call audit multiple times" do + it "should update audit options" do + user = Models::ActiveRecord::UserOnlyName.create + user.update(password: "new password 1", name: "new name 1") + expect(user.audits.last.audited_changes.keys).to eq(%w[name]) + + user.class.class_eval do + audited only: :password + end + + user = Models::ActiveRecord::UserOnlyName.last + user.update(password: "new password 2", name: "new name 2") + expect(user.audits.last.audited_changes.keys).to eq(%w[password]) + end + end end diff --git a/spec/support/active_record/models.rb b/spec/support/active_record/models.rb index 34dde868..53b57863 100644 --- a/spec/support/active_record/models.rb +++ b/spec/support/active_record/models.rb @@ -36,6 +36,12 @@ class UserOnlyPassword < ::ActiveRecord::Base audited only: :password end + class UserOnlyName < ::ActiveRecord::Base + self.table_name = :users + attribute :non_column_attr if Rails.gem_version >= Gem::Version.new("5.1") + audited only: :name + end + class UserRedactedPassword < ::ActiveRecord::Base self.table_name = :users audited redacted: :password From d1c1b681a86e40238894db4615e4123b5e9e152e Mon Sep 17 00:00:00 2001 From: mohammednasser-32 Date: Tue, 22 Oct 2024 18:59:21 +0300 Subject: [PATCH 2/3] return if options did not change --- lib/audited/auditor.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/audited/auditor.rb b/lib/audited/auditor.rb index ae43fdb4..6b0eef15 100644 --- a/lib/audited/auditor.rb +++ b/lib/audited/auditor.rb @@ -108,6 +108,9 @@ def has_associated_audits def update_audited_options(new_options) previous_audit_options = self.audited_options set_audited_options(new_options) + + return if previous_audit_options == self.audited_options + self.reset_audited_columns log_message = "#{self.name} is already audited, audit options will be updated\n"\ From 882d1cb7742b7c779c5f6612578353e11bfa9f54 Mon Sep 17 00:00:00 2001 From: mohammednasser-32 Date: Tue, 22 Oct 2024 21:58:46 +0300 Subject: [PATCH 3/3] remove log message --- lib/audited/auditor.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/audited/auditor.rb b/lib/audited/auditor.rb index 6b0eef15..a164f72a 100644 --- a/lib/audited/auditor.rb +++ b/lib/audited/auditor.rb @@ -108,15 +108,7 @@ def has_associated_audits def update_audited_options(new_options) previous_audit_options = self.audited_options set_audited_options(new_options) - - return if previous_audit_options == self.audited_options - self.reset_audited_columns - - log_message = "#{self.name} is already audited, audit options will be updated\n"\ - "before: #{previous_audit_options}\n"\ - "after: #{self.audited_options}" - Logger.new($stdout).info(log_message) end def set_audited_options(options)