Class: Tracebook::RedactionPipeline

Inherits:
Object
  • Object
show all
Defined in:
lib/tracebook/redaction_pipeline.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config: Tracebook.config) ⇒ RedactionPipeline

Returns a new instance of RedactionPipeline.



9
10
11
# File 'lib/tracebook/redaction_pipeline.rb', line 9

def initialize(config: Tracebook.config)
  @config = config
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



7
8
9
# File 'lib/tracebook/redaction_pipeline.rb', line 7

def config
  @config
end

Instance Method Details

#apply_callable_redactors!(data) ⇒ Object (private)



24
25
26
27
28
29
30
31
# File 'lib/tracebook/redaction_pipeline.rb', line 24

def apply_callable_redactors!(data)
  redactors = Array(config.redactors) + Array(config.custom_redactors)
  redactors.each do |redactor|
    apply_to_request!(data, redactor)
    apply_to_response!(data, redactor)
    apply_to_metadata!(data, redactor)
  end
end

#apply_database_rules!(data) ⇒ Object (private)



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/tracebook/redaction_pipeline.rb', line 33

def apply_database_rules!(data)
  Tracebook::RedactionRule.where(enabled: true).order(:priority).find_each do |rule|
    callable = ->(value) { redact_string(value, rule.compiled_pattern, rule.replacement) }

    case rule.applies_to.to_sym
    when :request
      apply_to_request!(data, callable)
    when :response
      apply_to_response!(data, callable)
    when :both
      apply_to_request!(data, callable)
      apply_to_response!(data, callable)
    when :metadata
      apply_to_metadata!(data, callable)
    end
  end
end

#apply_to_metadata!(data, redactor) ⇒ Object (private)



61
62
63
# File 'lib/tracebook/redaction_pipeline.rb', line 61

def apply_to_metadata!(data, redactor)
  data[:metadata] = deep_transform(data[:metadata], redactor)
end

#apply_to_request!(data, redactor) ⇒ Object (private)



51
52
53
54
# File 'lib/tracebook/redaction_pipeline.rb', line 51

def apply_to_request!(data, redactor)
  data[:request_payload] = deep_transform(data[:request_payload], redactor)
  data[:request_text] = redactor.call(data[:request_text]) if data[:request_text].is_a?(String)
end

#apply_to_response!(data, redactor) ⇒ Object (private)



56
57
58
59
# File 'lib/tracebook/redaction_pipeline.rb', line 56

def apply_to_response!(data, redactor)
  data[:response_payload] = deep_transform(data[:response_payload], redactor)
  data[:response_text] = redactor.call(data[:response_text]) if data[:response_text].is_a?(String)
end

#call(normalized) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/tracebook/redaction_pipeline.rb', line 13

def call(normalized)
  data = normalized.to_h.deep_dup

  apply_callable_redactors!(data)
  apply_database_rules!(data)

  NormalizedInteraction.new(**data)
end

#deep_transform(value, redactor) ⇒ Object (private)



65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/tracebook/redaction_pipeline.rb', line 65

def deep_transform(value, redactor)
  case value
  when String
    redactor.call(value)
  when Hash
    value.each_with_object({}) do |(key, nested), memo|
      memo[key] = deep_transform(nested, redactor)
    end
  when Array
    value.map { |nested| deep_transform(nested, redactor) }
  else
    value
  end
end

#redact_string(value, pattern, replacement) ⇒ Object (private)



80
81
82
83
84
# File 'lib/tracebook/redaction_pipeline.rb', line 80

def redact_string(value, pattern, replacement)
  return value unless value.is_a?(String)

  value.gsub(pattern, replacement)
end