Class: LcpRuby::Workflow::AuditWriter

Inherits:
Object
  • Object
show all
Defined in:
lib/lcp_ruby/workflow/audit_writer.rb

Constant Summary collapse

OPTIONAL_FIELDS =
%w[workflow_version user_id user_snapshot comment metadata].freeze

Class Method Summary collapse

Class Method Details

.clear_cache!Object



46
47
48
# File 'lib/lcp_ruby/workflow/audit_writer.rb', line 46

def self.clear_cache!
  @field_mapping = nil
end

.field_mappingObject



41
42
43
44
# File 'lib/lcp_ruby/workflow/audit_writer.rb', line 41

def self.field_mapping
  @field_mapping ||= LcpRuby.configuration.workflow_audit_model_fields
    .transform_keys(&:to_s).freeze
end

.log(record:, workflow_definition:, transition:, from_state:, to_state:, user:, comment: nil, metadata: nil) ⇒ Object



6
7
8
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
# File 'lib/lcp_ruby/workflow/audit_writer.rb', line 6

def self.log(record:, workflow_definition:, transition:, from_state:, to_state:, user:, comment: nil, metadata: nil)
  return unless AuditRegistry.available?

  audit_class = AuditRegistry.audit_model_class
  return unless audit_class

  model_name = record.class.name.demodulize.underscore
  fields = field_mapping
  columns = audit_class.column_names

  attrs = {
    fields["record_type"] => model_name,
    fields["record_id"] => record.id,
    fields["workflow_name"] => workflow_definition.name,
    fields["transition_name"] => transition.name,
    fields["from_state"] => from_state,
    fields["to_state"] => to_state
  }

  # Only include optional fields if the column exists on the audit model
  optional = {
    "workflow_version" => workflow_definition.version,
    "user_id" => user&.id,
    "user_snapshot" => UserSnapshot.capture(user),
    "comment" => comment,
    "metadata" => 
  }
  optional.each do |logical_name, value|
    mapped = fields[logical_name]
    attrs[mapped] = value if columns.include?(mapped)
  end

  audit_class.create!(attrs)
end