Module: Journaled::AuditLog::BlockedMethods

Defined in:
lib/journaled/audit_log.rb

Constant Summary collapse

BLOCKED_METHODS =
{
  delete: '#destroy',
  update_column: '#update!',
  update_columns: '#update!',
}.freeze

Instance Method Summary collapse

Instance Method Details

#_journaled_audit_log_check!(method, **kwargs) ⇒ Object

rubocop:disable Metrics/AbcSize



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/journaled/audit_log.rb', line 157

def _journaled_audit_log_check!(method, **kwargs) # rubocop:disable Metrics/AbcSize
  force_was = AuditLog._force
  AuditLog._force = kwargs.delete(:_force) if kwargs.key?(:_force)
  audited_columns = kwargs.keys - audit_log_config.ignored_columns

  if method == :delete || audited_columns.any?
    column_message = <<~MSG if kwargs.any?
      You are attempting to change the following audited columns:
        #{audited_columns.inspect}

    MSG
    raise <<~MSG if audit_log_config.enabled? && !AuditLog._force
      #{column_message}Using `#{method}` is blocked because it skips audit logging (and other Rails callbacks)!
      Consider using `#{BLOCKED_METHODS[method]}` instead, or pass `_force: true` as an argument.
    MSG
  end

  yield
ensure
  AuditLog._force = force_was
end

#delete(**kwargs) ⇒ Object



139
140
141
142
143
# File 'lib/journaled/audit_log.rb', line 139

def delete(**kwargs)
  _journaled_audit_log_check!(:delete, **kwargs) do
    super()
  end
end

#update_column(name, value, **kwargs) ⇒ Object



145
146
147
148
149
# File 'lib/journaled/audit_log.rb', line 145

def update_column(name, value, **kwargs)
  _journaled_audit_log_check!(:update_column, **kwargs.merge(name => value)) do
    super(name, value)
  end
end

#update_columns(args = {}, **kwargs) ⇒ Object



151
152
153
154
155
# File 'lib/journaled/audit_log.rb', line 151

def update_columns(args = {}, **kwargs)
  _journaled_audit_log_check!(:update_columns, **args.merge(kwargs)) do
    super(args.merge(kwargs).except(:_force))
  end
end