Class: LcpRuby::ModelFactory::AuditingApplicator

Inherits:
Object
  • Object
show all
Defined in:
lib/lcp_ruby/model_factory/auditing_applicator.rb

Instance Method Summary collapse

Constructor Details

#initialize(model_class, model_definition) ⇒ AuditingApplicator

Returns a new instance of AuditingApplicator.



4
5
6
7
# File 'lib/lcp_ruby/model_factory/auditing_applicator.rb', line 4

def initialize(model_class, model_definition)
  @model_class = model_class
  @model_definition = model_definition
end

Instance Method Details

#apply!Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/lcp_ruby/model_factory/auditing_applicator.rb', line 9

def apply!
  return unless @model_definition.auditing?

  model_def = @model_definition
  options = model_def.auditing_options

  # Install after_create callback
  @model_class.after_create do
    next unless Auditing::Registry.available?

    Auditing::AuditWriter.log(
      action: :create,
      record: self,
      options: options,
      model_definition: model_def
    )
  end

  # Install after_update callback (skip if record was just created)
  @model_class.after_update do
    next unless Auditing::Registry.available?

    Auditing::AuditWriter.log(
      action: :update,
      record: self,
      options: options,
      model_definition: model_def
    )
  end

  # Install after_destroy callback
  @model_class.after_destroy do
    next unless Auditing::Registry.available?

    Auditing::AuditWriter.log(
      action: :destroy,
      record: self,
      options: options,
      model_definition: model_def
    )
  end

  # Add has_many :audit_logs association (polymorphic via auditable_type/auditable_id)
  fields = LcpRuby.configuration.audit_model_fields.transform_keys(&:to_s)
  type_field = fields["auditable_type"]
  id_field = fields["auditable_id"]

  @model_class.define_method(:audit_logs) do
    audit_class = Auditing::Registry.audit_model_class
    return audit_class.none unless audit_class

    audit_class
      .where(type_field => model_def.name, id_field => id)
      .order(created_at: :desc)
  end

  # Convenience method with limit
  @model_class.define_method(:audit_history) do |limit: 50|
    audit_logs.limit(limit)
  end
end